教程 cpp tutorial

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++ 编程的效率和灵活性。