学科分类
目录
C++基础

deque类模板

deque在接口上和vector非常相似,在许多操作的地方也可以直接替换(它们是序列容器共同的特征),那么接下来我们对deque对象的创建、插入和删除元素等一些函数的讲解就容易多了。

1、创建deque对象

deque对象的创建也是由其构造函数来完成的,根据deque类模板中重载的构造函数,deque对象创建主要有以下几种形式:

deque<T> d;        //创建一个空的deque对象
deque<T> d(n);       //创建一个有n个数据的对象,默认值由构造函数提供
deque<T> d(n,elem);   //创建一个有n个数据的对象,元素值都是elem
deque<T> d(begin, end); //创建一个以[begin, end)区间值为元素的对象
deque<T> d(d1);      //创建d对象,用d1对象初始化

创建deque对象有这五种方式,分别用这五种方式创建五个deque对象,如下所示:

deque<char> d1;        
deque<int> d2(10);      
deque<float> d3(6,10.1);   
deque<string> d4(begin, end); 
deque<int> d5(d2);     

上述代码分别以不同的方式创建了char、int、float等数据类型的deque对象。<>括号内也可以指定指针类型或自定义类型。

2、赋值

deque的赋值函数与vector向量相同,都是使用assign()函数,函数调用如下所示:

d.assign(n, elem);
d.assign(begin, end);

d是创建的deque对象,后续deque容器的函数讲解中,如无特殊说明,d均指创建的deque对象。这两个函数的含义与vector向量调用的含义一样:第一个重载函数是用n个elem元素为d赋值,第二个重载函数是用[begin, end)区间的值为其赋值。

3、元素访问

双端队列的元素访问也提供了与vector一样的方法,函数调用如下所示:

d[int idx];   //重载了[]运算符,可以用[]直接访问
d.at(int idx); //访问idx位置上的元素
d.front();   //返回第一个元素
d.back();    //返回最后一个元素
d.begin();   //返回第一个元素的迭代器
d.end();    //返回指向最后一个元素的下一个迭代器

这些函数的用法与vector中的用法一样,都是用相应的容器对象直接调用,这里就不再举例说明,读者可自己创建deque对象,然后用不同的方法来访问容器中的元素。

4、添加元素

向deque容器中插入元素时,有很多不同的方法,可以从头尾两端插入元素也可以从中间插入元素,各函数的调用如下所示:

d.push_back();  //在尾部插入元素
d.push_front(); //在头部插入元素
d.insert(pos, elem); //在pos位置上插入元素elem
d.insert(pos, n, elem); //在pos位置上插入n个元素elem
d.insert(pos, begin, end); //在pos位置上插入[begin, end)区间的值作为元素

其中push_front()函数是从头部插入元素,这是vector容器所不具有的。但它的用法与push_back()等函数都相同。

5、删除元素

从deque容器中删除元素时,也有很多不同的方法,可以头尾两端删除元素也可以从中间删除元素,各函数的调用如下所示:

d.pop_back(); //从尾部删除元素
d.pop_front(); //从头部删除元素
d.erase(pos);   //从中间删除元素
d.erase(begin, end); //删除[begin, end)区间的元素

其中pop_front()函数是从头部删除元素。因为deque队列可以从头尾两端同时删除和插入元素,那么接下来,我们就用一个案例来演示从deque容器两端插入和删除元素,具体如例1所示。

例1

 1    #include <iostream>
 2    #include <deque>
 3    using namespace std;
 4    int main()
 5    {
 6            deque<int> d(10);  //创建一个deque容器
 7    
 8            //为容器赋值并输出容器中的元素
 9            for (int i = 0; i < 10; i++)
 10                d[i] = i;   //为容器赋值
 11            cout << "赋值后,输出容器的元素:" << endl;
 12            for (int i = 0; i < 10; i++)
 13                cout << d.at(i) << " ";
 14              cout<<endl;
 15    
 16            //在头尾部插入元素
 17            d.push_front(99); //在头部插入33
 18            d.push_back(77);  //在尾部插入77
 19    
 20            //插入元素后再次输出
 21            cout << "在头尾部插入元素后:" << endl;
 22            for (int i = 0; i < 12; i++)   //插入元素后,现在有12个元素
 23                cout << d.at(i) << " ";
 24            cout << endl;
 25    
 26            //在头尾部删除元素
 27            d.pop_front();  //删除头部元素
 28            d.pop_back();  //删除尾元素
 29            d.erase(d.begin() + 3); //删除begin + 3位置的元素
 30    
 31            //删除元素后再次输出
 32            cout << "在头尾部删除元素后:" << endl;
 33            for (int i = 0; i < 9; i++)   //插入元素后,现在有9个元素
 34                cout << d.at(i) << " ";
 35            cout << endl;
 36            system("pause");
 37            return 0;
 38    }

运行结果如图1所示。

图1 例运行结果

在例1中,创建了一个大小为10的deque对象,代码9-14行给容器中元素赋值并输出,由图8-8可以看出,赋值成功。接着代码17-18行分别调用push_front()与push_back()函数向容器中添加元素,然后输出,由图8-8可知,在头尾部添加元素成功。最后代码27-29又分别调用不同的函数删除元素,由图1可知,元素删除成功。

点击此处
隐藏目录