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;
}
三、实践示例(综合应用)
- 动态数组管理:
#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 结束),计算总和并删除偶数。
- 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 模块调用。
四、注意事项与最佳实践
- 内存管理:
vector
自动管理内存,但扩容可能导致 O(n) 开销。- 用
reserve(n)
预分配容量,减少重分配:cpp vector<int> v; v.reserve(100); // 预分配 100 个元素空间
- 边界检查:
- 优先用
at()
代替[]
确保安全:cpp try { v.at(10); } catch (const out_of_range& e) { cout << "Out of range"; }
- 性能优化:
- 用
emplace_back()
代替push_back()
,减少拷贝:cpp v.emplace_back(42); // 直接构造
- 避免频繁
insert
/erase
中间元素(O(n)),考虑deque
。
- C++20/23 特性:
- 用
std::span
提供vector
的安全视图:cpp #include <span> void printSpan(std::span<int> s) { for (int x : s) cout << x << " "; }
- 2025年趋势:
- C++23:
vector
支持更优化的移动语义。 - KMP:
vector
用于 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 示例)或有问题,告诉我,我可以提供更详细解答!