STL在C++中起到非常重要的作用,最大的好处就是将常见的数据结构进行了封装,使得我们不需要从底层一步步去实现,使用起来非常方便。C++知识小屋🏠的STL系列旨在将常见STL库的常见函数进行小结,以函数+示例+结果展示的方式作为文章的整体结构。希望能够在用到这些库的时候能够快速上手,熟练地使用它们来解决一些常见的问题。
deque是什么
-
现在我们来回顾一下前面几节学到过的STL容器,按照能不能用迭代器访问可以大体分成两类:
- 支持迭代器访问:map(可用下标访问),set,multimap,multiset,vector(可用下标访问),list
- 不支持迭代器访问:栈(stack),队列(queue),优先队列(priority_queue)
-
说实话,上面的两种类型有着各自的优缺点:
- 比如list能够快速地插入和删除,但是不能用下标快速访问。
- 比如vector能够用下标访问,但是插入删除的效率非常低。
- 比如栈,队列,优先队列不能用迭代器访问,要访问所有元素必须不断弹出先前的元素。
-
双端队列deque可以简单理解为是vector和list的融合,既可以用迭代器访问,也可以用"[]"下标访问,当然,它所要花费的内存空间自然也是非常大的。
-
如果要使用deque,需要在程序的开头加上下面的库:
#include <deque>
deque的用法
上面提到了deque同时包含了list和vector的功能,那么下面用一个例子来说说它的用法:
-
deque提供了三种插入元素的方法,分别为push_front,push_back,insert
-
deque提供了三种遍历输出元素的方法:迭代器访问,"[]"下标访问法,与vector类似的.at()函数访问法
-
deque提供了三种删除元素的方法,分别为pop_front,pop_back,erase
- 可以看到下面的例子,首先创建一个名为A的deque容器,开始时为空,size为0
- 通过push_back发现元素输入到了deque的后面,push_front发现元素输入到了deque的前面,通过insert方法将"coke"输入到了第二个位置
- 通过下标"[]"方法和迭代器的方法遍历了元素均成功
- 通过erase删除了第二个位置的元素"coke"
- 通过pop_front删除了最前面的元素"apple"
- 通过pop_back删除了最后面的元素"orange"
#include <iostream>
#include <deque>
#include <string>
using namespace std;
int main(){
//构造对象A (后面的两个'>'中间一定要有空格,否则会报错)
deque<string> A;
cout << "刚开始的时候A.empty() = " << A.empty() << " ,A.size() = " << A.size() << endl << endl;
cout << "当前容器的最大存储量为: " << A.max_size() << endl << endl;
//插入元素, push_back表示从后面插入, push_front表示从前面插入
A.push_back("cool"); //从后面输入
A.push_back("orange");
A.push_front("pandas"); //从前面输入
A.push_front("apple");
//两种输出deque的方法
cout << "下标法输出: " ;
for(int i=0;i<A.size();i++){
cout << A[i] << " ";
}
cout << endl << endl;
cout << "迭代法输出: " ;
for(deque<string>::iterator it = A.begin();it!=A.end();it++){
cout << *it << " ";
}
cout << endl << endl;
//删除元素
A.erase(A.begin() + 1);
cout << "erase删除第二个元素后(A.at(i)法输出)): " ;
for(int i=0;i<A.size();i++){
cout << A.at(i) << " ";
}
cout << endl << endl;
A.pop_front();
cout << "pop_front删除最前面的元素后: " ;
for(int i=0;i<A.size();i++){
cout << A.at(i) << " ";
}
cout << endl << endl;
A.pop_back();
cout << "pop_back删除最后面的元素后: " ;
for(int i=0;i<A.size();i++){
cout << A.at(i) << " ";
}
cout << endl << endl;
return 0;
}