C++ 向量

C++ 向量

C++ 中的向量 (vector) 是一种可动态调整大小的数组

向量和数组都是用于存储相同数据类型元素的数据结构。

数组与向量的区别在于:数组的大小不可修改(无法增删元素),而向量可以根据需要自动扩容或缩容。

使用向量需要包含 <vector> 头文件:

// 引入 vector 库
#include <vector>

创建 Vector

使用 vector 关键字创建向量,在尖括号 <> 内指定存储的数据类型,然后命名向量,语法为:

vector<type> vectorName

实例

// 创建一个存储字符串的向量,命名为 cars
vector<string> cars;

若要在声明时初始化元素,可以使用大括号 {} 包裹逗号分隔的列表(与数组类似):

实例

// 创建并初始化一个存储字符串的向量
vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 打印 vector 元素
for (string car : cars) {
  cout << car << "\n";
}

亲自试一试

注意:向量的类型(如本例中的 string)在声明后不可更改。

访问 Vector 元素

通过方括号 [] 内指定索引号来访问元素。

与数组类似,向量的索引从 0 开始,即 [0] 是第一个元素,[1] 是第二个,依此类推:

实例

// 创建一个存储字符串的向量,命名为 cars
vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

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

// 获取第二个元素
cout << cars[1];  // 输出 BMW

亲自试一试

vector 库的优势在于提供了许多实用函数。例如,可以用 .front().back() 分别访问首尾元素:

实例

// 创建一个存储字符串的向量,命名为 cars
vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 获取第一个元素
cout << cars.front();  // 输出 Volvo

// 获取最后一个元素 
cout << cars.back();   // 输出 Tesla

亲自试一试

要访问指定索引处的元素,可以使用 .at() 函数并指定索引号:

实例

// 创建一个名为 cars 的向量,用于存储字符串
vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 获取第二个元素
cout << cars.at(1);

// 获取第三个元素
cout << cars.at(2);

亲自试一试

注意:通常更推荐使用 .at() 函数而非方括号 [],因为当元素超出范围时,.at() 函数会抛出错误信息:

实例

// 创建一个名为 cars 的向量,用于存储字符串
vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 尝试访问不存在的元素(将抛出异常)
cout << cars.at(6);

亲自试一试

修改向量元素

要更改特定元素的值,可以引用其索引号:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

// 更改第一个元素的值
cars[0] = "Opel";

cout << cars[0];  // 现在输出 Opel 而非 Volvo

亲自试一试

然而,使用 .at() 函数更为安全:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

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

cout << cars.at(0);  // 现在输出 Opel 而非 Volvo

亲自试一试

添加向量元素

向量和数组的最大区别在于,向量可以动态增长。这意味着可以向向量中添加或删除元素。

要向向量中添加元素,可以使用 .push_back() 函数,该函数会在向量的末尾添加一个元素:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cars.push_back("Audi");

亲自试一试

可以添加任意数量的元素:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cars.push_back("Audi");
cars.push_back("VW");
cars.push_back("BYD");
cars.push_back("Mini");

亲自试一试

删除向量元素

要从向量中删除元素,可以使用 .pop_back() 函数,该函数会从向量的末尾删除一个元素:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cars.pop_back();

亲自试一试

向量大小

要了解向量中有多少个元素,可以使用 .size() 函数:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cout << cars.size();  // 输出 4

亲自试一试

检查向量是否为空

还有一个函数可以用来判断向量是否为空。

.empty() 函数在向量为空时返回 1(true),在向量包含一个或多个元素时返回 0(false):

实例

vector<string> cars;
cout << cars.empty();  // 输出 1(向量为空)

亲自试一试

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};
cout << cars.empty();  // 输出 0(向量不为空)

亲自试一试

遍历向量

可以使用 for 循环结合 .size() 函数来遍历向量元素:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

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

亲自试一试

也可以使用 C++ 11(2011 年)引入的 for-each 循环,这种方式更简洁、更易读:

实例

vector<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

for (string car : cars) {
  cout << car << "\n";
}

亲自试一试

提示:还可以使用迭代器来遍历向量,这将在后续章节中详细介绍。