C++ vector 容器浅析(2025年中文讲解)

vector 是 C++ 标准模板库(STL)中的动态数组容器,位于 <vector> 头文件中,用于存储和操作元素序列。相比 C 的静态数组,vector 提供动态大小调整、内存管理和丰富的方法,广泛应用于算法、数据处理和跨平台开发(如 KMP)。2025年,C++20/23 增强了 vector 的性能和安全性(如 std::span 集成),在高性能计算和嵌入式系统中应用广泛。本教程浅析 vector 的核心功能、语法和实践,基于 C++ 标准文档、CSDN 和 C++ 社区,适合初学者和开发者。建议用 C++ 编译器(如 GCC、Clang)或在线 IDE(如 Compiler Explorer)练习。


一、vector 容器概览(必知)
  • 定义std::vector 是一个模板类,存储连续内存中的元素,支持动态扩容和随机访问。
  • 核心特点
    • 动态大小:自动调整容量,添加/删除元素无需手动管理。
    • 随机访问:通过索引(如 v[i])快速访问,时间复杂度 O(1)。
    • 类型安全:结合模板支持任意类型(需满足可拷贝/可移动)。
  • 用途
    • 存储动态数据(如用户输入、算法结果)。
    • 替代 C 数组,提供更安全和便捷的操作。
    • 在高性能场景(如游戏开发)中管理数据序列。
  • 2025年趋势
    • C++23 优化 vector 的内存分配和移动语义。
    • 在 KMP(Kotlin Multiplatform)中,C++ vector 用于 native 模块数据处理。
    • 结合 std::span(C++20)提供更安全的数组视图。

二、核心语法与用法(必会)

以下按功能讲解 vector 的核心操作,包含示例代码,可用 C++11 或更高版本编译运行。

1. 基本操作
  • 包含头文件和命名空间

    #include <vector>
    #include <iostream>
    using namespace std;
    
  • 声明和初始化

    int main() {
        vector<int> v1; // 空 vector
        vector<int> v2 = {1, 2, 3}; // 初始化列表
        vector<int> v3(5, 10); // 5 个元素,每个为 10
        vector<int> v4(v2); // 拷贝构造
        
        cout << "v2: ";
        for (int x : v2) cout << x << " "; // 输出:1 2 3
        cout << "\nv3: ";
        for (int x : v3) cout << x << " "; // 输出:10 10 10 10 10
        return 0;
    }
    
  • 访问元素

    • 索引v[i](不检查边界,快速但不安全)。
    • at()v.at(i)(检查边界,抛出 out_of_range)。
    • front()/back():访问首/尾元素。
    int main() {
        vector<int> v = {1, 2, 3};
        cout << v[0] << endl; // 输出:1
        cout << v.at(1) << endl; // 输出:2
        cout << v.front() << endl; // 输出:1
        cout << v.back() << endl; // 输出:3
        // v.at(10); // 抛出 out_of_range
        return 0;
    }
    
2. 添加和删除元素
  • 添加元素

    • push_back():尾部添加,O(1)(均摊)。
    • emplace_back():尾部构造(C++11,效率更高)。
    • insert():指定位置插入。
    int main() {
        vector<int> v;
        v.push_back(1); // 添加 1
        v.emplace_back(2); // 构造并添加 2
        v.insert(v.begin() + 1, 3); // 在索引 1 插入 3
        for (int x : v) cout << x << " "; // 输出:1 3 2
        return 0;
    }
    
  • 删除元素

    • pop_back():删除尾部,O(1)。
    • erase():删除指定位置或范围。
    • clear():清空所有元素。
    int main() {
        vector<int> v = {1, 2, 3, 4};
        v.pop_back(); // 删除 4
        v.erase(v.begin()); // 删除 1
        for (int x : v) cout << x << " "; // 输出:2 3
        v.clear(); // 清空
        cout << "\nSize: " << v.size(); // 输出:0
        return 0;
    }
    
3. 大小和容量
  • size():当前元素数量,O(1)。
  • capacity():当前分配的内存容量。
  • resize(n):调整大小,填充默认值或截断。
  • reserve(n):预分配容量,避免频繁扩容。
    int main() {
        vector<int> v = {1, 2, 3};
        cout << "Size: " << v.size() << endl; // 输出:3
        cout << "Capacity: " << v.capacity() << endl; // 输出:>=3
        v.reserve(10); // 预分配 10 个元素空间
        cout << "New Capacity: " << v.capacity() << endl; // 输出:>=10
        v.resize(5, 0); // 调整为 5 个元素,填充 0
        for (int x : v) cout << x << " "; // 输出:1 2 3 0 0
        return 0;
    }
    
4. 迭代器
  • 迭代器:用于遍历或操作元素。
    • begin()/end():起始/结束迭代器。
    • rbegin()/rend():反向迭代器。
    int main() {
        vector<int> v = {1, 2, 3};
        for (auto it = v.begin(); it != v.end(); ++it) {
            cout << *it << " "; // 输出:1 2 3
        }
        cout << endl;
        for (auto it = v.rbegin(); it != v.rend(); ++it) {
            cout << *it << " "; // 输出:3 2 1
        }
        return 0;
    }
    

三、实践示例(综合应用)
  1. 动态数组管理
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v;
    // 添加用户输入
    cout << "Enter numbers (0 to stop): ";
    int num;
    while (cin >> num && num != 0) {
        v.push_back(num);
    }
    // 打印和求和
    int sum = 0;
    for (int x : v) {
        sum += x;
        cout << x << " ";
    }
    cout << "\nSum: " << sum << endl;
    // 删除偶数
    for (auto it = v.begin(); it != v.end();) {
        if (*it % 2 == 0) {
            it = v.erase(it);
        } else {
            ++it;
        }
    }
    cout << "After removing evens: ";
    for (int x : v) cout << x << " "; // 输出奇数
    return 0;
}
**功能**:用户输入数字(0 结束),计算总和并删除偶数。
  1. KMP 集成(C++ Native 模块)
#include <vector>
#include <string>
#include <algorithm>

extern "C" {
    // 假设与 Kotlin 互操作
    void processStrings(const char** input, int size, char** output) {
        std::vector<std::string> v(input, input + size);
        // 排序
        std::sort(v.begin(), v.end());
        // 转换为 C 风格字符串
        for (int i = 0; i < size; ++i) {
            output[i] = strdup(v[i].c_str());
        }
    }
}
**功能**:C++ `vector` 处理字符串数组,排序后返回,供 Kotlin 模块调用。
四、注意事项与最佳实践
  1. 内存管理
    • vector 自动管理内存,但扩容可能导致 O(n) 开销。
    • reserve(n) 预分配容量,减少重分配:
      vector<int> v;
      v.reserve(100); // 预分配 100 个元素空间
      
  2. 边界检查
    • 优先用 at() 代替 [] 确保安全:
      try { v.at(10); } catch (const out_of_range& e) { cout << "Out of range"; }
      
  3. 性能优化
    • emplace_back() 代替 push_back(),减少拷贝:
      v.emplace_back(42); // 直接构造
      
    • 避免频繁 insert/erase 中间元素(O(n)),考虑 deque
  4. C++20/23 特性
    • std::span 提供 vector 的安全视图:
      #include <span>
      void printSpan(std::span<int> s) {
          for (int x : s) cout << x << " ";
      }
      
  5. 2025年趋势
    • C++23vector 支持更优化的移动语义。
    • KMPvector 用于 native 层数据处理,与 Kotlin 互操作。
    • AI 辅助:Clangd 和 Copilot 可生成 vector 代码。

五、学习建议
  • 练习:用 GCC 实践 vector 的添加、删除和遍历,写排序或过滤程序。
  • 资源
  • 时间:2-3 天掌握基本操作,1 周熟悉高级用法。
  • 实践:实现动态数组管理或算法(如排序、查找)。

六、总结

C++ vector必知动态数组、随机访问和内存管理,必会初始化、添加/删除元素和迭代器操作。2025年,vector 仍是 C++ 核心容器,结合 C++20/23 特性更高效,适合高性能和 KMP 开发。相比 C 数组,vector 安全且灵活。

如果需要具体场景代码(如算法或 KMP 示例)或有问题,告诉我,我可以提供更详细解答!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐