C++ vector 容器浅析

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) 预分配容量,减少重分配:
    cpp vector<int> v; v.reserve(100); // 预分配 100 个元素空间
  1. 边界检查
  • 优先用 at() 代替 [] 确保安全:
    cpp try { v.at(10); } catch (const out_of_range& e) { cout << "Out of range"; }
  1. 性能优化
  • emplace_back() 代替 push_back(),减少拷贝:
    cpp v.emplace_back(42); // 直接构造
  • 避免频繁 insert/erase 中间元素(O(n)),考虑 deque
  1. C++20/23 特性
  • std::span 提供 vector 的安全视图:
    cpp #include <span> void printSpan(std::span<int> s) { for (int x : s) cout << x << " "; }
  1. 2025年趋势
  • C++23vector 支持更优化的移动语义。
  • KMPvector 用于 native 层数据处理,与 Kotlin 互操作。
  • AI 辅助:Clangd 和 Copilot 可生成 vector 代码。

五、学习建议

  • 练习:用 GCC 实践 vector 的添加、删除和遍历,写排序或过滤程序。
  • 资源
  • C++ 文档:https://en.cppreference.com/w/cpp/container/vector
  • CSDN:搜索“C++ vector”。
  • B站:C++ 教程(如“尚硅谷 C++”)。
  • 时间:2-3 天掌握基本操作,1 周熟悉高级用法。
  • 实践:实现动态数组管理或算法(如排序、查找)。

六、总结

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

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

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注