deque容器概述
std::deque(双端队列)是C++标准库中的一个容器,类似于std::vector,但它提供了在头部和尾部高效插入和删除元素的能力,时间复杂度为O(1)。与std::vector不同,std::deque不保证所有元素都存储在连续的内存空间中,而是通过一系列分段的连续内存块来存储元素,这些内存块通过一个中控器(map)连接起来,中控器维护每个内存块的地址,从而实现逻辑上的连续性
deque的赋值方式
std::deque提供了多种赋值方式:
- 拷贝赋值:使用
operator=可以将一个deque的对象赋值给另一个deque对象,实现浅拷贝。 - 区间赋值:使用
assign(beg, end)可以从其他容器或数组的一个区间复制元素到deque中。 - 重复赋值:使用
assign(n, elem)可以将n个相同的元素elem赋值给deque
deque的插入方式
std::deque提供了多种插入元素的方式:
- 尾部插入:使用
push_back(elem)可以在deque的尾部添加一个元素。 - 头部插入:使用
push_front(elem)可以在deque的头部添加一个元素。 - 指定位置插入:使用
insert(pos, elem)可以在指定位置pos插入一个元素;使用insert(pos, n, elem)可以在指定位置pos插入n个相同的元素elem;使用insert(pos, beg, end)可以在指定位置pos插入从beg到end的区间内的所有元素
deque的empty()函数
empty()函数用于检查deque容器是否为空,如果为空则返回true,否则返回false。这是一个常数时间操作
deque的内部结构
std::deque的内部结构由多个分段的连续内存块组成,每个内存块的大小通常是固定的。中控器(map)是一个指针数组,每个元素是指向一个内存块的指针。当需要在头部或尾部插入元素时,deque会动态地增加新的内存块,并更新中控器,确保逻辑上的连续性。这种设计使得deque能够在头部和尾部高效地插入和删除元素,但牺牲了迭代器的简单性和随机访问的效率
deque的resize()函数
resize()函数用于改变deque的大小。如果新的大小大于当前大小,deque会用默认值或指定值填充新增的部分;如果新的大小小于当前大小,deque会删除多余的元素。这是一个线性时间操作
标准算法库algorithm
<algorithm>头文件提供了大量的泛型算法,可以应用于任何符合迭代器要求的容器。例如,sort()函数可以用于对deque中的元素进行排序,find()函数可以用于查找元素,reverse()函数可以用于反转元素顺序等
sort()的应用
sort()函数是一个高效的排序算法,通常使用快速排序或归并排序。它可以对deque中的元素进行排序,但需要注意的是,sort()函数需要传递两个迭代器,分别指向要排序的范围的开始和结束位置
代码逐句解释
#include<iostream>
#include<string>
#include<deque>
#include<algorithm>//标准算法头文件
using namespace std;
// 打印deque容器中的元素
void printdeque(deque<int>&d) {
for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
// 测试函数
void test01() {
// 创建一个空的deque容器
deque<int>d1;
// 向deque容器尾部插入1到10的整数
for (int i = 1; i <= 10; i++) {
d1.push_back(i);
}
// 打印deque容器中的元素
printdeque(d1);
// 创建另一个空的deque容器
deque<int>d2;
// 使用赋值操作符将d1的元素复制到d2
d2 = d1;
// 打印d2中的元素
printdeque(d2);
// 从d2的尾部删除8个元素
for (int s = 8; s > 0; s--) {
d2.pop_back();
}
// 打印d2中的元素
printdeque(d2);
// 创建第三个空的deque容器
deque<int>d3;
// 使用assign函数将d1中的元素复制到d3
d3.assign(d1.begin(), d1.end());
// 打印d3中的元素
printdeque(d3);
// 检查d1是否为空,如果不为空则打印d1的大小
if (d1.empty()) {
cout << "d1为空" << endl;
}
else {
cout << "d1的大小:" << d1.size() << endl;
// 因为deque的容器没有容量的概念,故deque没有capacity函数
// 因为deque内部结构
// 将d1的大小调整为15,新插入的元素值为1
d1.resize(15, 1);
// 打印d1中的元素
printdeque(d1);
}
// 在d1的头部插入多个元素
d1.push_front(10);
d1.push_front(20);
d1.push_front(80);
d1.push_front(5);
d1.push_front(45);
// 使用sort函数对d1中的元素进行排序
sort(d1.begin(), d1.end());
// 打印排序后的d1中的元素
printdeque(d1);
}
int main() {
// 调用测试函数
test01();
// 暂停程序,等待用户按键
system("pause");
return 0;
}
详细解释
-
包含头文件:
#include<iostream> #include<string> #include<deque> #include<algorithm>//标准算法头文件 using namespace std;#include<iostream>:包含输入输出流的头文件,用于标准输入输出操作。#include<string>:包含字符串类的头文件,虽然在这个示例中没有直接使用字符串类,但为了完整性还是包含进来。#include<deque>:包含deque容器的头文件。#include<algorithm>:包含标准算法库的头文件,用于调用排序等算法。using namespace std;:使用标准命名空间,避免每次调用标准库函数时都要加上std::前缀。
-
定义打印函数:
void printdeque(deque<int>&d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) { cout << *it << " "; } cout << endl; }void printdeque(deque<int>&d):定义一个函数,接收一个deque<int>类型的引用参数。for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++):使用常量迭代器遍历deque容器。cout << *it << " ":输出当前迭代器指向的元素值。cout << endl;:输出换行符,结束一行。
-
测试函数:
void test01() { deque<int>d1; for (int i = 1; i <= 10; i++) { d1.push_back(i); } printdeque(d1);deque<int>d1;:创建一个空的deque<int>容器。for (int i = 1; i <= 10; i++) { d1.push_back(i); }:使用循环向deque容器尾部插入1到10的整数。printdeque(d1);:调用打印函数,输出deque容器中的元素。
-
拷贝赋值:
deque<int>d2; d2 = d1; printdeque(d2);deque<int>d2;:创建另一个空的deque<int>容器。d2 = d1;:使用赋值操作符将d1的元素复制到d2。printdeque(d2);:调用打印函数,输出d2中的元素。
-
删除元素:
for (int s = 8; s > 0; s--) { d2.pop_back(); } printdeque(d2);for (int s = 8; s > 0; s--) { d2.pop_back(); }:使用循环从d2的尾部删除8个元素。printdeque(d2);:调用打印函数,输出d2中的元素。
-
区间赋值:
deque<int>d3; d3.assign(d1.begin(), d1.end()); printdeque(d3);deque<int>d3;:创建第三个空的deque<int>容器。d3.assign(d1.begin(), d1.end());:使用assign函数将d1中的元素复制到d3。printdeque(d3);:调用打印函数,输出d3中的元素。
-
检查容器是否为空:
if (d1.empty()) { cout << "d1为空" << endl; } else { cout << "d1的大小:" << d1.size() << endl; d1.resize(15, 1); printdeque(d1); }if (d1.empty()) { cout << "d1为空" << endl; }:检查d1是否为空,如果是则输出“d1为空”。else { cout << "d1的大小:" << d1.size() << endl; }:如果不是空,则输出d1的大小。d1.resize(15, 1);:将d1的大小调整为15,新插入的元素值为1。printdeque(d1);:调用打印函数,输出调整大小后的d1中的元素。
-
头部插入元素:
d1.push_front(10); d1.push_front(20); d1.push_front(80); d1.push_front(5); d1.push_front(45);d1.push_front(10);:在d1的头部插入元素10。d1.push_front(20);:在d1的头部插入元素20。d1.push_front(80);:在d1的头部插入元素80。d1.push_front(5);:在d1的头部插入元素5。d1.push_front(45);:在d1的头部插入元素45。
-
排序:
sort(d1.begin(), d1.end()); printdeque(d1);sort(d1.begin(), d1.end());:使用sort函数对d1中的元素进行排序。printdeque(d1);:调用打印函数,输出排序后的d1中的元素。
-
主函数:
int main() { test01(); system("pause"); return 0; }test01();:调用测试函数。system("pause");:暂停程序,等待用户按键。return 0;:返回0,表示程序正常结束。
2万+

被折叠的 条评论
为什么被折叠?



