Vector 向量

Vector 是一种动态数组,属于 STL 中的容器类之一,它提供了可以自动扩展大小的数组功能。与传统的数组不同,Vector 在需要时会自动调整大小,且支持快速访问、插入、删除等操作。

Vector 的特点:

  • 动态大小Vector 的大小是动态变化的,可以根据需要自动增长或缩小,避免了固定大小数组的限制。
  • 按索引访问:可以像数组一样使用索引来访问 Vector 中的元素。
  • 存储效率Vector 会根据需要自动调整内部存储的大小,通常会预留一些额外空间来减少频繁的内存重新分配。
  • 随机访问:支持快速随机访问,时间复杂度为 O(1),就像数组一样。
  • 支持常见操作Vector 提供了许多常见的操作,如插入、删除、查找、排序等。

Vector 的优点:

  • 灵活性:不需要事先知道容器的大小,可以动态调整。
  • 效率:与数组相比,Vector 在元素插入和删除时表现更好,尤其是插入到末尾时。
  • 内存管理Vector 会根据需要自动调整内部容量,减少了内存浪费。

Vector 的缺点:

  • 在中间插入和删除效率低:虽然插入和删除操作通常很高效,但在 Vector 中间插入或删除元素时,可能需要移动大量的元素,时间复杂度为 O(n)。
  • 内存重新分配:当 Vector 需要扩展容量时,它会分配一个新的更大的数组,并将元素复制到新的位置,这个过程可能会影响性能,尤其是元素较多时。

Vector 的常见操作:

  • 访问元素:使用索引或迭代器访问元素。
  • 插入元素:可以在末尾插入元素,或者在指定位置插入。
  • 删除元素:可以删除指定位置的元素,或者删除末尾的元素。
  • 查找元素:可以使用 find 等函数查找元素。

示例(C++):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector> // 引入vector头文件
using namespace std;

int main()
{
// 创建一个空的vector
vector<int> vec;

// 在末尾插入元素
vec.push_back(10); // 插入10
vec.push_back(20); // 插入20
vec.push_back(30); // 插入30

// 访问元素
cout << "第一个元素: " << vec[0] << endl; // 输出: 10
cout << "第二个元素: " << vec.at(1) << endl; // 输出: 20

// 删除末尾元素
vec.pop_back(); // 删除30

// 遍历vector
cout << "Vector中的元素: ";
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " "; // 输出: 10 20
}
cout << endl;

// 在指定位置插入元素
vec.insert(vec.begin() + 1, 15); // 在第二个位置插入15

cout << "插入15后的元素: ";
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " "; // 输出: 10 15 20
}
cout << endl;

return 0;
}

代码解析:

  • push_back:将元素添加到 Vector 的末尾。
  • vec[0]vec.at(1):通过索引或 at 方法访问元素,at 方法会进行越界检查。
  • pop_back:删除 Vector 末尾的元素。
  • insert:在指定位置插入元素,vec.begin() + 1 表示第二个位置。

Vector 的应用:

  • 动态数组Vector 主要用于处理不知道大小的动态数据集合,且需要快速随机访问和插入删除操作。
  • 实现其他数据结构Vector 可以用来实现栈、队列等数据结构。例:栈可以用 push_back 添加元素,使用 pop_back 删除元素。
  • 数据存储:适用于存储需要动态增加或删除元素的场景,如图像数据、传感器数据等。
  • 算法优化:由于 Vector 支持高效的随机访问,它常用于一些需要按位置访问元素的算法,如快速排序、查找算法等。

总结:

Vector 是一个灵活且高效的动态数组容器,广泛应用于需要动态管理数据的场景。相比传统数组,它提供了更好的内存管理和扩展能力,适用于频繁添加元素的场合。

在使用 Vector 时,需要注意插入删除中间元素的性能问题,并根据具体情况选择合适的数据结构。如果你需要频繁在中间插入或删除元素,链表可能是一个更好的选择。