STL系列-----deque容器详细说明

1、基本概念

功能:双端数组,可以对头端进行插入删除操作

deque与vector区别:

vector对于头部的插入删除效率低,数据量越大,效率越低
deque相对而言,对头部的插入删除速度比vector快
vector访问元素时的速度会比deque快,这和两者内部实现有关

deque容器的迭代器也支持随机访问

2、构造函数

默认构造形式

deque<T>  deqT

构造函数将[beg,end)区间中的元素拷贝给本身。

deque(beg,end)

构造函数将n个elem拷贝给本身。

deque(n,elem)

拷贝构造函数

deque(const deque& deq)

如果要限制数据是只读状态,那么迭代器的状态也要发生改变

扫描二维码关注公众号,回复: 10607663 查看本文章
#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
 for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 //无参构造,默认构造 
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 //第二种
 deque<int>d2(d1.begin(),d1.end()) ;
 printDeque(d2);
 //第三种
 deque<int>d3(10,100) ;
 printDeque(d3);
 //第四种
 deque<int>d4(d3); 
 printDeque(d4);
}
int main()
{
    test01();
}

deque和vector容器构造方式几乎一样

3、赋值操作

重载等号操作符

vector& operator=const vector&vec)

将[beg,end)区间中的数据拷贝赋值给本身

assign(beg,end)

将n个elem拷贝赋值给本身

assign(n,elem);

代码如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
 for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 //第一种
 deque<int>d2; 
 d2=d1;
 printDeque(d2);
 //第二种 
 deque<int>d3;
 d3.assign(d1.begin(),d1.end()) ;
 printDeque(d3);
 //第三种
 deque<int>d4;
 d4.assign(10,100);
 printDeque(d4);
 
}
int main()
{
    test01();
}

4、容量、大小操作

对deque容器容量和大小判断

判断容器是否为空

empty()

返回容器中元素的个数

size()

重新指定容器的长度为num

resize(int num)

若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
 

重新指定容器的长度为num

resize(int num,elem);

若容器变长,则以elem值填充新位置。如果容器变短,则未尾超出容器长度的元素被删除

deque没有容量概念,但有大小概念
因为它是一个双端数组

代码如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 if(d1.empty())
 {
  cout<<"d1为空"<<endl;
 }
 else
 {
  cout<<"d1不为空"<<endl;
  cout<<"d1的大小为:"<<d1.size()<<endl;
 }
 //重新指定大小 
 d1.resize(15,2);
 printDeque(d1);
 d1.resize(5);
 printDeque(d1);
}
int main()
{
    test01();
}

总结:

deque没有容量的概念

判断是否为空------empty

返回元素个数-----------size

重新指定个数------------resize

5、插入和删除

向deque中插入和删除数据

函数原型:

在容器尾部添加一个数据

push_back(elem);

在容器头部插入一个数据

push_front(elem)

删除容器最后一个数据

pop_back()

删除容器第一个数据

pop_front()

指定位置操作:
在pos位置插入一个elem元素的拷贝,返回新数据的位置

insert(pos,elem)

在pos位置插入n个elem数据,无返回值。

insert(pos,n,elem)

在pos位置插入[beg.end)区间的数据,无返回值。

insert(pos,beg,end)

清空容器的所有数据

clear()

删除[beg.end)区间的数据,返回下一个数据的位置。

erase(beg,end)

删除pos位置的数据,返回下一个数据的位置。

erase(pos)

其中,pos都是迭代器
代码如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//两端操作 
void test01()
{
 deque<int> d;
 //尾插 
 d.push_back(10);
 d.push_back(20);
 //头插 
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 //尾删
 d.pop_back();
 //200 100 10
 printDeque(d);
 //头删
 d.pop_front();
 //100 10
 printDeque(d);
}
void test02()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 d.insert(d.begin(),1000); 
 //1000,200 100 10 20
 printDeque(d); 
 d.insert(d.begin(),2,1000); 
 //1000,1000,1000,200 100 10 20
 printDeque(d); 
 //指定位置插入区间
 deque<int> d2;
 d2.push_back(1);
 d2.push_back(2);
 d2.push_front(10);
 d2.push_front(20);
 d.insert(d.begin(),d2.begin(),d2.end());
 printDeque(d); 
}
void test03()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 d.erase(d.begin());
 //100 10 20
 printDeque(d); 
 //删除指定项
 deque<int>::iterator it=d.begin();
 it++;
 d.erase(it);
 printDeque(d); 
 //清空
 //d.clear();
 d.erase(d.begin(),d.end());
 printDeque(d); 
}
int main()
{
    //test01();
    //test02();
    test03();
}

6、数据存取

返回索引idx所指的数据

at(int idx)

返回索引idx所指的数据

operator[]

返回容器中第一个数据元素

front()

返回容器中最后一个数据元素

back()

代码如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//两端操作 
void test01()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 printDeque(d);
 for(int i=0;i<d.size();i++)
 {
  cout<<d[i]<<" ";
 }
 cout<<endl;
 for(int i=0;i<d.size();i++)
 {
  cout<<d.at(i)<<" ";
 }
 cout<<endl;
 cout<<"第一个元素为:"<<d.front()<<endl;
 cout<<"最后一个元素为:"<<d.back()<<endl;
}
int main()
{
    test01();
}

7、排序

对beg和end区间内元素进行排序

sort(iterator    beg,iterator   end)

代码如下

#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//两端操作 
void test01()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 printDeque(d);
 cout<<"排序后:"<<endl;
 sort(d.begin(),d.end());
 printDeque(d);
}
int main()
{
    test01();
}

默认sort都是升序排序,也可以添加函数改为降序排序

发布了37 篇原创文章 · 获赞 3 · 访问量 1165

猜你喜欢

转载自blog.csdn.net/qq_45721778/article/details/105314843