std::deque(double-ended queue)双端队列,是有下标的顺序容器。它允许在其首尾两端快速插入及删除。另外,在deque任一端插入或删除不会非法化指向其余元素的指针或引用(例如vector删除第一个元素,其他所有迭代器的值都会指向下一个元素,而deque删除后指向元素为空)
与std::vector相反,deque 的元素不是连续存储的,典型实现:用单独分配的固定大小数组的序列,外加额外的登记,这表示下标访问必须进行二次指针解引用,与之相比vector的下标访问只进行一次。
deque的存储按需自动扩展及收缩。扩张deque比扩张std::vector更优,因为它不涉及复制既存元素到新内存位置。另一方面,deque典型地拥有较大的最小内存开销;只有一个元素的deque必须分配其整个内部数组。
1.构造std::deque<int> d1{ 1,2,3,4,5 }; //d1 = 1,2,3,4,5
std::deque<int> d2(3, 5); //d2 = 5,5,5
std::deque<int> d3(d1.begin(), d1.begin() + 2); //d3 = 1,2
2.添加
d2.emplace(d2.begin() + 1, 2); //开始的下一个位置添加一个2:5,2,5,5
d2.emplace_back(3); //末尾添加一个3:5,2,5,5,3
d2.emplace_front(4); //首部添加一个4:4,5,2,5,5,3
d2.push_back(6); //末尾添加一个6:{4,5,2,5,5,3,6}
d2.insert(d2.end(), 1);//末尾添加一个1:{4,5,2,5,5,3,6,1}
d2.insert(d2.begin(), { 7,8,9 }); //首部添加一组7,8,9:{7,8,9,4,5,2,5,5,3,6,1}
3.访问
auto ret1 = d2.front();
auto ret2 = d2.back();
auto ret3 = *d2.begin();
auto ret4 = d2[5]; //从0开始第5个
auto ret5 = d2.at(2);//从0开始第2个
//auto r1 = d2.at(100); //崩溃
//auto r2 = d2[100]; //中断
4.删除
d2.pop_back(); //移除最后一个元素
d2.pop_front();//移除第一个元素
d2.erase(d2.begin());//移除指定位置的一个元素(移除第一个元素)
d2.erase(d2.begin(), d2.begin() + 2); //移除指定范围的n个元素(移除前两个元素)
d2.clear();//清空元素
5.其他
判断是否为空
empty()
deque为空返回true
元素个数
size()
两个队列互相交换元素
赋值
改变容器中可存储元素的个数
返回可容纳的最大元素数
完整示例代码