C++ Vectors

2025 年 8 月 29 日 | 阅读 10 分钟

在 C++ 中,vector 是标准模板库 (STL) 的一部分。它们是动态数组,在添加或删除元素时可以自动调整大小。

C++ Vectors

与具有固定大小的数组不同,vector 提供了广泛的灵活性和底层函数,这使得它们成为 C++ 中最有用的数据结构之一。vector 提供了许多有用的成员函数,例如 push_back()、insert()、size()、clear()、front()、pop_back() 等。

vector 是一种序列容器类,它实现了一个动态数组,这意味着在追加元素时大小会自动更改。vector 将元素存储在连续的内存位置,并在运行时根据需要分配内存。当需要更多空间时,vector 会分配新内存,将现有元素复制到新内存,然后处理旧内存。

语法

它具有以下语法:

在这个语法中,

  • T 表示元素的类型。
  • v 表示 vector 的名称。

创建 Vector

如果我们需要创建一个 vector,我们必须包含 <vector> 头文件。

C++ Vector 示例

让我们看一个简单的例子来说明 C++ Vector。

示例

编译并运行

输出

Vector created

插入元素

在 C++ 中,可以通过 insert() 方法将元素插入到 vector 中,该方法需要线性时间。如果我们想在末尾插入数字,可以使用 push_back() 方法。它工作得更快,只需要恒定的时间。

语法

它具有以下系统

C++ 中插入 C++ 元素

让我们看一个在 C++ 中插入元素的简单例子。

示例

编译并运行

输出

T p o i n t

访问和更新元素

我们可以使用 [] 运算符或 at() 方法访问元素。[] 方法速度快但不安全,因为它不检查给定的索引是否存在于 vector 中。我们还可以使用 .at() 方法来访问元素。可以通过使用索引分配新值来更新元素。

语法

它具有以下语法:

访问和更新元素示例

让我们举一个例子来说明如何在 vector 中访问和更新元素。

示例

编译并运行

输出

The Accessing Value at position 4 is: u
The Accessing Value at position 3 is: o
The Updating Value at Position 4 is: y
The Updating Value at Position 2 is: z

查找 Vector 大小

数组的一个主要常见问题是需要维护一个单独的变量来跟踪它们的大小。Vector 可以通过使用 size() 函数来解决这个问题,该函数有助于返回 vector 中当前元素的数量。

语法

它具有以下语法

查找 Vector 大小的示例

让我们举一个例子来说明 C++ 中 vector 的大小。

示例

编译并运行

输出

The Size of Vector is: 10

遍历 Vector

我们可以使用传统的 for 循环、基于范围的 for 循环和迭代器来遍历 vector。我们可以利用循环并通过 vector size() 方法确定 vector 的大小来迭代此范围。

遍历 Vector 的示例

让我们举一个例子来说明如何在 C++ 中遍历 vector。

示例

编译并运行

输出

T p o i n t T e c h

删除元素

vector 允许使用 erase() 和 pop_back() 函数删除最后一个元素或从任何位置删除元素。如果我们知道 vector 中元素的值,我们可以使用 find() 函数来查找该元素的位置。之后,我们可以使用 vector pop_back() 函数删除只需要恒定时间的元素。

语法

它具有以下语法:

在 Vector 中删除元素的示例

让我们举一个例子来说明如何在 C++ 中的 vector 中删除元素。

示例

编译并运行

输出

T p o i n

Vector 操作的时间复杂度

操作时间复杂度
访问 (索引)O(1)
插入 (末尾)O(1)
删除 (末尾)O(1)
插入 (中间)O(n)
删除 (中间)O(n)

将 Vector 传递给函数

vector 可以按值(复制)、引用(修改原始)或 const 引用(只读)传递。

语法

它具有以下语法:

Vector 的内部工作原理

在 C++ 中,vector 可以自动管理其存储。当我们插入一个元素并且没有剩余容量时,vector 会通过分配新内存、将现有元素复制到新内存并删除旧内存来调整自身大小。这种机制确保 push_back() 以摊销常数时间运行。

要点

  • 容量通常大于大小。
  • 容量可以通过 capacity() 检查。
  • 如果知道大小,请使用 reserve() 来预先分配内存。

多维 Vector

vector 可以嵌套以创建 2D 或 3D 结构。它在涉及矩阵的问题中很有用。

语法

它具有以下语法:

多维 Vector 示例

让我们举一个例子来说明 C++ 中的多维 vector。

示例

编译并运行

输出

1 2 3
4 5 6
7 8 9

说明

此代码创建一个具有三行三列的 2D vector(矩阵),并用特定值对其进行初始化。之后,它使用嵌套循环以逐行顺序打印每个元素,从而创建一个矩阵。

C++ Vector 函数

在 C++ 中,vector 提供了多种函数来执行不同类型的操作。下表显示了函数的名称及其描述。

函数描述
at()它提供对元素的引用。
back()它提供对最后一个元素的引用。
front()它提供对第一个元素的引用。
swap()它交换两个 vector 之间的元素。
push_back()它在末尾添加一个新元素。
pop_back()它从 vector 中删除最后一个元素。
empty()它确定 vector 是否为空。
insert()它在指定位置插入新元素。
erase()它删除指定的元素。
resize()它修改 vector 的大小。
clear()它从 vector 中删除所有元素。
size()它确定 vector 中的元素数量。
capacity()它确定 vector 的当前容量。
assign()它为 vector 分配新值。
operator=()它为 vector 容器分配新值。
operator[]()它访问指定元素。
end()它指向 vector 中的最后一个元素。
emplace()它在位置 pos 之前插入一个新元素。
emplace_back()它在末尾插入一个新元素。
rend()它指向 vector 中第一个元素之前的元素。
rbegin()它指向 vector 的最后一个元素。
begin()它指向 vector 的第一个元素。
max_size()它返回 vector 可以容纳的最大元素数量。
cend()它指向 vector 中最后一个元素之后的元素。
cbegin()它指向 vector 的第一个元素。
crbegin()它指向 vector 的最后一个字符。
crend()它指向 vector 中第一个元素之前的元素。
data()它将 vector 的数据写入数组。
shrink_to_fit()它减小容量,使其等于 vector 的大小。

C++ Vectors 示例

让我们看一个程序,演示 C++ 中各种 vector 函数。

示例

编译并运行

输出

Vector elements: 10 15 17 25 30 40 50
Size: 7
Capacity: 7
Max Size: 1073741823
After deletion: 15 17 25 30 40
Front: 15
Back: 40
At(1): 17
After swap v1: 100 200
Is v1 empty? Yes
After assign: 99 99 99
First element via data(): 99

Vector 和 Array 之间的区别

在 C++ 中,数组和 vector 都用于存储相似数据类型的集合,但它们在结构、灵活性和内存管理方面有所不同。

特性ArrayVector
大小它可以在编译时固定。它可以在运行时动态更改。
内存管理手动由 vector 自动处理
灵活性高(如 push_back、insert 等函数)
STL 兼容性有限完全兼容
边界检查不提供at() 方法提供边界检查
初始化int arr[5];vector<int> v(5);

总而言之,C++ 中的 vector 非常高效、易于使用,并且是原始数组的强大替代方案。它们为动态调整大小、插入、删除和遍历提供了丰富的任务集,并与 STL 的其余部分良好集成。掌握 vector 不仅可以简化代码,还可以使其更高效、更整洁。无论我们是处理像矩阵这样的复杂结构还是简单数据,vector 都是我们在 C++ 中的首选工具。

C++ Vectors 选择题

1. 有什么重要特性将 vector 与 C++ 中的传统数组区分开来?

  1. Vectors 只能存储整数
  2. Vectors 的大小是固定的
  3. Vectors 支持动态调整大小
  4. Vector 不能用于任务
 

答案:c) Vectors 支持动态调整大小


2. 当 C++ vector 超过其当前容量时,内部会发生什么?

  1. 程序会抛出运行时错误
  2. Vector 会放弃旧元素来腾出空间
  3. Vector 会分配新内存并复制现有元素
  4. Vector 会转换为链表
 

答案:c) Vector 会分配新内存并复制现有元素


3. 下列哪项最好地描述了 vector 中的 capacity() 函数?

  1. 返回调用 push_back() 的次数
  2. 返回在重新分配之前可以存储的元素数量
  3. 给出 vector 的实际内存地址
  4. 返回从 vector 中删除的元素数量
 

答案:b) 返回在重新分配之前可以存储的元素数量


4. 与 C++ 中的原始数组相比,使用 vector 的主要优势是什么?

  1. vector 不需要内存
  2. B vectors 速度慢但更具可读性
  3. vector 具有底层的动态大小和实用函数
  4. vector 不支持按索引访问元素
 

答案:c) vector 具有底层的动态大小和实用函数


5. reserve() 函数在 vector 方面有什么作用?

  1. 设置 vector 的精确大小
  2. 移除 vector 中未使用的内存
  3. 持续分配内存以避免重新分配
  4. 清理 vector 的内容
 

答案:c) 预分配内存以避免频繁的重新分配。


下一主题C++ Queue