C++ 向量

在 C++ 中,向量用于存储相似数据类型的元素。但是,与 数组 不同,向量的大小可以动态增长。

也就是说,我们可以根据需要更改程序执行期间向量的大小。

向量是 C++ 标准模板库的一部分。要使用向量,我们需要在程序中包含 vector 头文件。

#include <vector>

C++ 向量声明

包含头文件后,我们可以在 C++ 中这样声明一个向量:

std::vector<T> vector_name;

类型参数 <T> 指定了向量的类型。它可以是任何基本数据类型,例如 intcharfloat 等。例如:

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};

在这里,我们通过直接向向量提供值来初始化向量。现在,vector1vector2 都用值 12345 初始化。

方法 2

vector<int> vector3(5, 12);

在这里,5 是向量的大小,12 是值。

此代码创建一个大小为 5int 向量,并使用值 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() 函数将元素 67 添加到向量中。

注意:我们还可以使用 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;

在这里,我们将索引 14 的值更改为新值。因此,索引 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;

例如,如果我们有 2intdouble 类型的向量,那么我们将需要 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 << "  ";
}

另请阅读:

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战