在 C++ 中,向量用于存储相似数据类型的元素。但是,与 数组 不同,向量的大小可以动态增长。
也就是说,我们可以根据需要更改程序执行期间向量的大小。
向量是 C++ 标准模板库的一部分。要使用向量,我们需要在程序中包含 vector
头文件。
#include <vector>
C++ 向量声明
包含头文件后,我们可以在 C++ 中这样声明一个向量:
std::vector<T> vector_name;
类型参数 <T>
指定了向量的类型。它可以是任何基本数据类型,例如 int
、char
、float
等。例如:
vector<int> num;
这里,num 是向量的名称。
请注意,我们在声明期间没有指定向量的大小。这是因为向量的大小可以动态增长,因此无需定义它。
C++ 向量初始化
有几种方法可以在 C++ 中初始化向量。
方法 1
// Initializer list
vector<int> vector1 = {1, 2, 3, 4, 5};
// Uniform initialization
vector<int> vector2 {1, 2, 3, 4, 5};
在这里,我们通过直接向向量提供值来初始化向量。现在,vector1
和 vector2
都用值 1、2、3、4、5 初始化。
方法 2
vector<int> vector3(5, 12);
在这里,5 是向量的大小,12 是值。
此代码创建一个大小为 5 的 int
向量,并使用值 12 初始化该向量。因此,该向量等同于:
vector<int> vector3 = {12, 12, 12, 12, 12};
示例:C++ 向量初始化
#include <iostream>
#include <vector>
using namespace std;
int main() {
// initializer list
vector<int> vector1 = {1, 2, 3, 4, 5};
// uniform initialization
vector<int> vector2{6, 7, 8, 9, 10};
// method 3
vector<int> vector3(5, 12);
cout << "vector1 = ";
// ranged loop
for (const int& i : vector1) {
cout << i << " ";
}
cout << "\nvector2 = ";
// ranged loop
for (const int& i : vector2) {
cout << i << " ";
}
cout << "\nvector3 = ";
// ranged loop
for (int i : vector3) {
cout << i << " ";
}
return 0;
}
输出
vector1 = 1 2 3 4 5 vector2 = 6 7 8 9 10 vector3 = 12 12 12 12 12
在这里,我们使用三种不同的初始化方法声明和初始化了三个不同的向量,并显示了它们的内容。
基本向量操作
vector
类提供了各种方法来对向量执行不同的操作。在本教程中,我们将介绍一些常用的向量操作。
- 添加元素
- 访问元素
- 更改元素
- 删除元素
1. 向向量添加元素
要向向量添加单个元素,我们使用 push_back()
函数。它将元素插入向量的末尾。例如:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Initial Vector: ";
for (const int& i : num) {
cout << i << " ";
}
// add the integers 6 and 7 to the vector
num.push_back(6);
num.push_back(7);
cout << "\nUpdated Vector: ";
for (const int& i : num) {
cout << i << " ";
}
return 0;
}
输出
Initial Vector: 1 2 3 4 5 Updated Vector: 1 2 3 4 5 6 7
这里,我们用元素 {1, 2, 3, 4, 5}
初始化了一个 int
向量 num。请注意以下语句:
num.push_back(6);
num.push_back(7);
在这里,push_back()
函数将元素 6
和 7
添加到向量中。
注意:我们还可以使用 insert()
和 emplace()
函数向向量添加元素。
2. 访问向量的元素
在 C++ 中,我们使用索引号来访问向量元素。这里,我们使用 at()
函数从指定索引访问元素。例如:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Element at Index 0: " << num.at(0) << endl;
cout << "Element at Index 2: " << num.at(2) << endl;
cout << "Element at Index 4: " << num.at(4);
return 0;
}
输出
Element at Index 0: 1 Element at Index 2: 3 Element at Index 4: 5
这里,
num.at(0)
- 访问索引为 0 的元素num.at(2)
- 访问索引为 2 的元素num.at(4)
- 访问索引为 4 的元素
注意: 就像数组一样,我们也可以使用方括号 []
来访问向量元素。例如:
vector<int> num {1, 2, 3};
cout << num[1]; // Output: 2
但是,at()
函数比 []
更受青睐,因为 at()
在向量越界时会抛出异常,而 []
会给出垃圾值。
vector<int> num {1, 2, 3};
// gives garbage value
cout << num[4];
// throws an exception
cout << num.at(4);
3. 更改向量元素
我们可以使用相同的 at()
函数更改向量的元素。例如:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
cout << "Initial Vector: ";
for (const int& i : num) {
cout << i << " ";
}
// change elements at indexes 1 and 4
num.at(1) = 9;
num.at(4) = 7;
cout << "\nUpdated Vector: ";
for (const int& i : num) {
cout << i << " ";
}
return 0;
}
输出
Initial Vector: 1 2 3 4 5 Updated Vector: 1 9 3 4 7
在上例中,请注意以下语句:
num.at(1) = 9;
num.at(4) = 7;
在这里,我们将索引 1 和 4 的值更改为新值。因此,索引 1 的值更改为 9,索引 4 的值更改为 7。
4. 从 C++ 向量中删除元素
要从向量中删除单个元素,我们使用 pop_back()
函数。例如:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> prime_numbers{2, 3, 5, 7};
// initial vector
cout << "Initial Vector: ";
for (int i : prime_numbers) {
cout << i << " ";
}
// remove the last element
prime_numbers.pop_back();
// final vector
cout << "\nUpdated Vector: ";
for (int i : prime_numbers) {
cout << i << " ";
}
return 0;
}
输出
Initial Vector: 2 3 5 7 Updated Vector: 2 3 5
在上例中,请注意以下语句:
prime_numbers.pop_back();
在这里,我们从向量中删除了最后一个元素(7)。
C++ 向量函数
在 C++ 中,vector 头文件提供了各种函数,可用于对向量执行不同的操作。
函数 | 描述 |
---|---|
size() |
返回向量中存在的元素数量 |
clear() |
删除向量的所有元素 |
front() |
返回向量的第一个元素 |
back() |
返回向量的最后一个元素 |
empty() |
如果向量为空,则返回 1 (true) |
capacity() |
检查向量的整体大小 |
C++ 向量迭代器
向量 迭代器 用于指向向量元素的内存地址。在某些方面,它们的作用类似于 C++ 中的 指针。
我们可以使用以下语法创建向量迭代器:
vector<T>::iterator iteratorName;
例如,如果我们有 2 个 int
和 double
类型的向量,那么我们将需要 2 个对应于其类型的不同迭代器:
// iterator for int vector
vector<int>::iterator iter1;
// iterator for double vector
vector<double>::iterator iter2;
初始化向量迭代器
我们可以使用 begin()
和 end()
函数来初始化向量迭代器。
1. begin() 函数
begin()
函数返回一个指向向量第一个元素的迭代器。例如:
vector<int> num = {1, 2, 3};
vector<int>::iterator iter;
// iter points to num[0]
iter = num.begin();
2. end() 函数
end()
函数指向向量最后一个元素之后的理论元素。例如:
// iter points to the last element of num
iter = num.end() - 1;
在这里,由于 end()
函数的性质,我们使用了代码 num.end() - 1
来指向 num 向量的最后一个元素,即 num[2]。
示例:C++ 向量迭代器
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
// declare iterator
vector<int>::iterator iter;
// initialize the iterator with the first element
iter = num.begin();
// print the vector element
cout << "num[0] = " << *iter << endl;
// iterator points to the 3rd element
iter = num.begin() + 2;
cout << "num[2] = " << *iter;
// iterator points to the last element
iter = num.end() - 1;
cout << "num[4] = " << *iter;
return 0;
}
输出
num[0] = 1 num[2] = 3 num[4] = 5
在此程序中,我们声明了一个 int
向量迭代器 iter 来与向量 num 一起使用。
// declare iterator
vector<int>::iterator iter;
然后,我们使用 begin()
函数将迭代器初始化为向量的第一个元素。
// initialize the iterator with the first element
iter = num.begin();
然后,我们通过解引用迭代器来打印向量元素:
// print the vector element
cout << "num[0] = " << *iter << endl;
然后,我们通过将 iter 的值更改为 num.begin() + 2
来打印向量的第三个元素。
最后,我们使用 end()
函数打印了向量的最后一个元素。
示例:使用迭代器遍历向量
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num {1, 2, 3, 4, 5};
// declare iterator
vector<int>::iterator iter;
// use iterator with for loop
for (iter = num.begin(); iter != num.end(); ++iter) {
cout << *iter << " ";
}
return 0;
}
输出
1 2 3 4 5
在这里,我们使用 for 循环,使用 begin()
和 end()
函数将迭代器 iter 从向量的开头初始化并遍历到向量的末尾。
// use iterator with for loop
for (iter = num.begin(); iter != num.end(); ++iter) {
cout << *iter << " ";
}
另请阅读: