C++ 双端队列
C++ 双端队列
在上一页中,您学习了队列中的元素是从末尾添加,从前面移除。
然而,双端队列(deque,全称double-edqueue)更加灵活,因为元素可以从两端(前端和后端)添加和移除。您还可以通过索引号访问元素。
要使用双端队列(deque),您必须包含 <deque> 头文件:
// Include the deque library
#include <deque>
创建一个双端队列
要创建双端队列,请使用 deque 关键字,并在尖括号 <> 内指定它应该存储的值的 类型,然后是双端队列的名称,例如:双端队列<类型> dequeName。
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars;
如果要在声明时添加元素,请将它们放在花括号内,并用逗号分隔 {}:
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// Print deque elements
for (string car : cars) {
cout << car << "";
}
亲自试一试 »
注意:双端队列的类型(在本例中为string)声明后无法更改。
访问双端队列
您可以通过方括号 [] 内的索引号访问双端队列中的元素。
双端队列的索引从 0 开始,这意味着 [0] 是第一个元素,[1] 是第二个元素,依此类推:
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第一个元素
cout << cars[0]; // Outputs Volvo
// 获取第二个元素
cout << cars[1]; // Outputs BMW
亲自试一试 »
您还可以使用 .front() 和 .back() 函数访问双端队列的第一个或最后一个元素:
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第一个元素
cout << cars.front();
// 获取最后一个元素
cout << cars.back();
亲自试一试 »
要访问指定索引处的元素,可以使用 .at() 函数并指定索引号:
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 获取第二个元素
cout << cars.at(1);
// Get the third element
cout << cars.at(2);
亲自试一试 »
注意:通常建议使用.at()函数而不是方括号[],因为如果元素超出范围,它会抛出错误信息:
示例
// 创建一个名为 cars 的双端队列,用于存储字符串。
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 尝试访问不存在的元素(将抛出异常)
cout << cars.at(6);
亲自试一试 »
修改双端队列元素
要修改特定元素的值,可以引用其索引号:
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 更改第一个元素的值
cars[0] = "Opel";
cout << cars[0]; // Now outputs Opel instead of Volvo
亲自试一试 »
但是,使用 .at() 函数更安全:
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 更改第一个元素的值
cars.at(0) = "Opel";
cout << cars.at(0); // Now outputs Opel instead of Volvo
亲自试一试 »
Add Deque Elements
要向双端队列添加元素,可以使用 .push_front() 将元素插入到队列的开头,使用 .push_back() 将元素插入到队列的末尾:
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 在开头添加一个元素
cars.push_front("Tesla");
// 在末尾添加一个元素
cars.push_back("VW");
亲自试一试 »
移除双端队列元素
要从双端队列中移除元素,请使用.pop_front()移除队列开头的元素,使用.pop_back()移除队列末尾的元素。
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
// 删除第一个元素
cars.pop_front();
// 删除最后一个元素
cars.pop_back();
亲自试一试 »
双端队列大小
要查找双端队列的元素个数,请使用 .size() 函数:
检查双端队列是否为空
使用 .empty() 函数来判断双端队列是否为空。
.empty() 函数返回 1(真)表示双端队列为空,否则返回 0(假):
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.empty(); // Outputs 0 (not empty)
亲自试一试 »
遍历双端队列
您可以使用 for 循环结合 .size() 函数来遍历双端队列元素:
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (int i = 0; i < cars.size(); i++) {
cout << cars[i] << "
";
}
亲自试一试 »
您还可以使用for-each 循环(C++ 版本 11 (2011) 中引入),它更简洁、更易读:
示例
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (string car : cars) {
cout << car << "
";
}
亲自试一试 »
提示:也可以使用迭代器遍历双端队列,您将在后面的章节中了解更多相关内容。

