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可知,元素删除成功。