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,表示程序正常结束。