好的,下面我将为你详细讲解C++中的vector容器,从基础概念到核心操作,并附带代码示例。


一、vector 基础概念

vector是C++标准模板库(STL)中的动态数组,具有以下特性:

  1. 连续存储:元素在内存中连续存放,支持随机访问(时间复杂度 $O(1)$)。
  2. 动态扩容:当空间不足时,自动分配更大的内存(通常扩容至原大小的 $1.5$ 或 $2$ 倍)。
  3. 模板类:支持任意数据类型,例如 vector<int>vector<string>

二、初始化 vector

以下是常见的初始化方式:

#include <vector>
#include <iostream>
using namespace std;

int main() {
    // 1. 空 vector
    vector<int> vec1;

    // 2. 指定大小和初始值
    vector<int> vec2(5, 10); // 5个元素,每个值为10

    // 3. 通过数组初始化
    int arr[] = {1, 2, 3};
    vector<int> vec3(arr, arr + 3);

    // 4. 列表初始化 (C++11)
    vector<int> vec4 = {4, 5, 6};

    return 0;
}

三、核心操作

1. 添加元素
vec1.push_back(7);       // 尾部插入元素
vec1.insert(vec1.begin() + 2, 8); // 在索引2处插入8

2. 删除元素
vec1.pop_back();         // 删除尾部元素
vec1.erase(vec1.begin() + 1); // 删除索引1处的元素
vec1.clear();            // 清空所有元素

3. 访问元素
cout << vec4[0];         // 通过下标访问(不检查越界)
cout << vec4.at(1);      // 安全访问(越界抛出异常)
cout << vec4.front();    // 首元素
cout << vec4.back();     // 尾元素

4. 容量管理
cout << vec4.size();     // 当前元素数量
cout << vec4.capacity(); // 当前分配的存储空间大小
vec4.reserve(100);       // 预分配空间(避免频繁扩容)
vec4.shrink_to_fit();    // 释放多余内存(C++11)


四、遍历 vector

1. 下标遍历
for (size_t i = 0; i < vec4.size(); ++i) {
    cout << vec4[i] << " ";
}

2. 迭代器遍历
for (auto it = vec4.begin(); it != vec4.end(); ++it) {
    cout << *it << " ";
}

3. 范围循环(C++11)
for (int num : vec4) {
    cout << num << " ";
}


五、注意事项

  1. 扩容代价push_back 可能导致内存重分配,频繁操作时建议用 reserve() 预分配空间。
  2. 迭代器失效:插入/删除元素可能使迭代器、指针或引用失效。
  3. 性能
    • 随机访问:$O(1)$
    • 尾部插入/删除:平均 $O(1)$(分摊后)
    • 中间插入/删除:$O(n)$

六、综合示例

#include <vector>
#include <algorithm> // 使用sort
#include <iostream>
using namespace std;

int main() {
    vector<int> nums = {3, 1, 4, 1, 5};
    nums.reserve(10); // 预分配空间

    // 添加元素
    nums.push_back(9);
    nums.insert(nums.begin(), 2);

    // 排序
    sort(nums.begin(), nums.end());

    // 遍历输出
    for (int n : nums) {
        cout << n << " ";
    }
    // 输出:1 1 2 3 4 5 9

    return 0;
}

总结

vector 是最常用的STL容器之一,适用于需要频繁随机访问、尾部操作且数据量动态变化的场景。熟练掌握其操作和特性,能显著提升C++开发效率。下一期将深入探讨 vector 的底层实现与高级用法。

更多推荐