C++ 双端队列
C++ 双端队列
在上一页中,你了解到队列中的元素是从尾部添加、头部移除的。
而双端队列(double-ended queue, Deque)更加灵活,它允许从两端(头部和尾部)添加或移除元素,还支持通过索引访问元素。
要使用双端队列,需包含 <deque>
头文件:
// 包含 deque 库 #include <deque>
创建双端队列
要创建一个双端队列,使用 deque
关键字,并在尖括号 <>
内指定它应存储的值的类型,然后是双端队列的名称:
deque<type> dequeName
实例
// 创建一个存储字符串的双端队列,名为 cars deque<string> cars;
若需在声明时初始化元素,可用花括号 {}
包裹逗号分隔的列表:
实例
// 创建并初始化 cars 双端队列 deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 遍历输出元素 for (string car : cars) { cout << car << "\n"; }
注意:双端队列的类型(如例中的 string
)一旦声明后不可更改。
访问双端队列元素
您可以通过在方括号 []
内引用索引号来访问双端队列元素。
双端队列的索引从 0 开始,这意味着 [0]
是第一个元素,[1]
是第二个元素,依此类推:
实例
// 创建一个名为 cars 的双端队列,用于存储字符串 deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 获取第一个元素 cout << cars[0]; // 输出 Volvo // 获取第二个元素 cout << cars[1]; // 输出 BMW
您还可以使用 .front()
和 .back()
函数访问双端队列的第一个或最后一个元素:
实例
// 创建一个名为 cars 的双端队列,用于存储字符串 deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 获取第一个元素 cout << cars.front(); // 获取最后一个元素 cout << cars.back();
要访问指定索引处的元素,可以使用 .at()
函数并指定索引号:
实例
// 创建一个名为 cars 的双端队列,用于存储字符串 deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 获取第二个元素 cout << cars.at(1); // 获取第三个元素 cout << cars.at(2);
注意:.at()
函数通常比方括号 []
更受青睐,因为如果元素超出范围,它会抛出错误消息:
实例
// 创建一个名为 cars 的双端队列,用于存储字符串 deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 尝试访问不存在的元素(将抛出异常) cout << cars.at(6);
更改双端队列元素
要更改特定元素的值,可以引用索引号:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 更改第一个元素的值 cars[0] = "Opel"; cout << cars[0]; // 现在输出 Opel 而不是 Volvo
然而,使用 .at()
函数更安全:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 更改第一个元素的值 cars.at(0) = "Opel"; cout << cars.at(0); // 现在输出 Opel 而不是 Volvo
添加双端队列元素
要向双端队列添加元素,可以使用 .push_front()
在双端队列的开头插入元素,使用 .push_back()
在末尾添加元素:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 在开头添加一个元素 cars.push_front("Audi"); // 在末尾添加一个元素 cars.push_back("VW");
移除双端队列元素
要从双端队列中移除元素,使用 .pop_front()
从双端队列的开头移除元素,使用 .pop_back()
从末尾移除元素:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; // 移除第一个元素 cars.pop_front(); // 移除最后一个元素 cars.pop_back();
双端队列大小
要找出双端队列有多少个元素,使用 .size()
函数:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; cout << cars.size(); // 输出 4
检查双端队列是否为空
使用 .empty()
函数来检查双端队列是否为空。
如果双端队列为空,.empty()
函数返回 1
(true),否则返回 0
(false):
实例
deque<string> cars; cout << cars.empty(); // 输出 1(双端队列为空)
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; cout << cars.empty(); // 输出 0(不为空)
遍历双端队列
您可以使用 for
循环结合 .size()
函数来遍历双端队列元素:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; for (int i = 0; i < cars.size(); i++) { cout << cars[i] << "\n"; }
您还可以使用 for-each
循环(在 C++11 版本(2011 年)中引入),它更简洁且更易读:
实例
deque<string> cars = {"Volvo", "BMW", "Ford", "Tesla"}; for (string car : cars) { cout << car << "\n"; }
提示:也可以使用迭代器遍历双端队列,您将在后面的章节中了解更多。