# vector

URL: https://caijiao.org/cpp/stl/vector
Source: docs/cpp/stl/vector.md
Description: 本节介绍 C++ 标准库中的 'vector' 容器，详细讲解其基本操作，包括初始化、元素访问、大小调整等。

在 C++ 中，`vector` 是标准模板库（STL）提供的动态数组容器。它具有动态调整大小的能力，可以存储任何类型的数据。`vector` 提供了方便的接口来进行元素的插入、删除、访问等操作。与传统的数组不同，`vector` 可以根据需要自动扩展其容量，使得在使用时更加灵活和高效。

## vector 的基本操作

### 1. 创建 `vector`

`vector` 可以通过多种方式进行初始化，如空初始化、指定大小初始化以及通过列表初始化。

```cpp
#include <iostream>
#include <vector>

int main() {
    // 空初始化
    std::vector<int> vec1;

    // 使用指定大小初始化
    std::vector<int> vec2(5, 10);  // 创建一个大小为 5，每个元素为 10 的 vector

    // 使用初始化列表初始化
    std::vector<int> vec3 = {1, 2, 3, 4, 5};

    // 打印初始化后的 vector
    for (int val : vec2) {
        std::cout << val << " ";  // 输出: 10 10 10 10 10
    }
    std::cout << std::endl;

    return 0;
}
````

### 2. 添加元素

使用 `push_back` 可以将元素添加到 `vector` 的末尾：

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};

    // 添加元素到末尾
    vec.push_back(4);

    for (int val : vec) {
        std::cout << val << " ";  // 输出: 1 2 3 4
    }

    return 0;
}
```

### 3. 访问元素

可以使用索引操作符（`[]`）或 `at()` 函数来访问 `vector` 中的元素。`at()` 会进行范围检查，而 `[]` 不会。

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {10, 20, 30, 40};

    std::cout << "Element at index 1: " << vec[1] << std::endl;  // 输出: 20
    std::cout << "Element at index 2: " << vec.at(2) << std::endl;  // 输出: 30

    return 0;
}
```

### 4. 删除元素

`vector` 提供了多种方法来删除元素：

* 使用 `pop_back()` 删除末尾的元素。
* 使用 `erase()` 删除指定位置的元素。
* 使用 `clear()` 清空所有元素。

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {10, 20, 30, 40};

    // 删除末尾元素
    vec.pop_back();
    
    // 删除指定位置的元素
    vec.erase(vec.begin() + 1);  // 删除第二个元素

    // 清空所有元素
    vec.clear();

    std::cout << "Size after clear: " << vec.size() << std::endl;  // 输出: 0

    return 0;
}
```

### 5. 访问大小和容量

`vector` 提供了 `size()` 和 `capacity()` 函数来获取当前容器的大小和容量。

* `size()` 返回容器中当前元素的数量。
* `capacity()` 返回容器在不重新分配内存的情况下可以容纳的最大元素数量。

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};

    std::cout << "Size: " << vec.size() << std::endl;  // 输出: 4
    std::cout << "Capacity: " << vec.capacity() << std::endl;  // 输出: 4

    return 0;
}
```

### 6. 迭代器

`vector` 支持使用迭代器进行遍历，可以使用 `begin()` 和 `end()` 获取迭代器。

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};

    // 使用迭代器遍历
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";  // 输出: 1 2 3 4
    }

    return 0;
}
```

## vector 的优势

* **动态扩展**：`vector` 能够自动扩展大小，避免了固定大小数组的限制。
* **随机访问**：`vector` 提供常数时间的随机访问，因此可以高效地访问任何元素。
* **内存连续性**：`vector` 内部是基于动态数组实现的，因此其元素在内存中是连续存储的，这使得它比其他容器（如链表）更具性能优势。

## vector 的局限性

* **插入/删除效率**：在 `vector` 中间插入或删除元素的效率较低，因为这需要移动其他元素来保持顺序。
* **内存重分配**：当 `vector` 超过当前容量时，会重新分配内存，这可能导致性能下降。

## 小结

`vector` 是一个非常灵活且高效的容器，适用于需要频繁访问和动态调整大小的场景。掌握 `vector` 的基本操作和使用场景，可以有效提高 C++ 编程的效率和灵活性。
