中文标准库:std::deque

vector

sizeof(deque)

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()

两个队列互相交换元素

赋值

改变容器中可存储元素的个数

返回可容纳的最大元素数

完整示例代码