Menu
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C++ 教程

C++ 主页 C++ 简介 C++ 入门 C++ 语法 C++ 输出 C++ 注释 C++ 变量 C++ 用户输入 C++ 数据类型 C++ 运算符 C++ 字符串 C++ 数学 C++ 布尔值 C++ if...Else C++ switch C++ while 循环 C++ for 循环 C++ break/continue C++ 数组 C++ 结构体 C++ 枚举 C++ 引用 C++ 指针

C++ 函数

C++ 函数 C++ 函数参数 C++ 函数重载 C++ 作用域 C++ 递归

C++ 类

C++ 面向对象编程 C++ 类/对象 C++ 类方法 C++ 构造函数 C++ 访问修饰符 C++ 封装 C++ 继承 C++ 多态 C++ 文件 C++ 异常 C++ 日期

C++ 数据结构

C++ 数据结构 & STL C++ 向量 C++ 列表 C++ 栈 C++ 队列 C++ 双端队列 C++ 集合 C++ 映射 C++ 迭代器 C++ 算法

C++ 如何

C++ 添加两个数字 C++ 随机数

C++ 参考资料

C++ 参考资料 C++ 关键字 C++ <iostream> C++ <fstream> C++ <cmath> C++ <string> C++ <cstring> C++ <ctime> C++ <vector> C++ <algorithm>

C++ 示例

C++ 示例 C++ 现实世界示例 C++ 编译器 C++ 练习 C++ 测验 C++ 证书


C++ 双端队列


C++ 双端队列

在上一页中,你学习了在 队列 中,元素是在尾部添加,在头部删除的。

然而,双端队列(double-ended queue 的缩写)更加灵活,因为元素可以从两端(头部和尾部)添加和删除。你还可以通过索引号访问元素。

要使用双端队列,你必须包含 <deque> 头文件

// 包含双端队列库
#include <deque>

创建双端队列

要创建双端队列,使用 deque 关键字,并指定它应该存储的值的类型,放在尖括号 <> 中,然后是双端队列的名称,例如:deque<type> dequeName

示例

// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars;

如果你想在声明时添加元素,将它们放在花括号 {} 中,用逗号分隔。

示例

// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

// 打印双端队列元素
for (string car : cars) {
  cout << car << "\n";
}
自己试试 »

注意:双端队列的类型(我们示例中的 string)在声明后不能更改。


访问双端队列

你可以通过在方括号 [] 中引用索引号来访问双端队列元素。

双端队列是 0 索引的,这意味着 [0] 是第一个元素,[1] 是第二个元素,依此类推。

示例

// 创建一个名为 cars 的双端队列,用于存储字符串
deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

// 获取第一个元素
cout << cars[0];  // 输出 Volvo

// 获取第二个元素
cout << cars[1];  // 输出 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);

// 获取第三个元素
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];  // 现在输出 Opel 而不是 Volvo
自己试试 »

但是,使用 .at() 函数更安全。

示例

deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

// 更改第一个元素的值
cars.at(0) = "Opel";

cout << cars.at(0);  // 现在输出 Opel 而不是 Volvo
自己试试 »

添加双端队列元素

要向双端队列添加元素,可以使用 .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() 函数。

示例

deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.size();  // 输出 4
自己试试 »

检查双端队列是否为空

使用 .empty() 函数来确定双端队列是否为空。

.empty() 函数在双端队列为空时返回 1 (true),否则返回 0 (false)。

示例

deque<string> cars;
cout << cars.empty();  // 输出 1 (双端队列为空)
自己试试 »

示例

deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.empty();  // 输出 0 (不为空)
自己试试 »

遍历双端队列

你可以使用 for 循环结合 .size() 函数来遍历双端队列元素。

示例

deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (int i = 0; i < cars.size(); i++) {
  cout << cars[i] << "\n";
}
自己试试 »

您也可以使用for-each循环(在C++版本11 (2011)中引入),它更简洁易读。

示例

deque<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};

for (string car : cars) {
  cout << car << "\n";
}
自己试试 »

提示:您还可以使用迭代器遍历双端队列,这将在后面的章节中详细介绍。



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.