C++ Vector 基础入门操作
一、Vector初始化:5种常用方式
1. 默认构造
创建空容器,适用于后续动态添加元素:
std::vector<int> vec; // 空vector,size=0
2. 指定大小和初值
预分配空间并初始化元素:
std::vector<int> vec(5); // 5个0(int默认值)
std::vector<float> vec(3, 1.5); // 3个1.5
3. 列表初始化(C++11)
直接赋予初始值:
std::vector<char> vowels = {'a', 'e', 'i', 'o', 'u'};
4. 复制其他容器
通过迭代器范围复制:
int arr[] = {1, 3, 5};
std::vector<int> vec(std::begin(arr), std::end(arr)); // 复制数组
std::vector<int> vec2(vec1); // 复制整个vector
5. 使用assign()
赋值
清空现有元素并重新赋值:
vec.assign(4, 100); // 4个100
vec.assign(oldVec.begin(), oldVec.end()); // 复制另一个容器的内容
二、增删改查:高效操作指南
1. 添加元素
- 尾部插入(高效,O(1)均摊):
vec.push_back(10); // 传统方式 vec.emplace_back(20); // 直接构造(避免拷贝,效率更高)
- 任意位置插入(谨慎使用,O(n)):
vec.insert(vec.begin() + 2, 30); // 在索引2处插入30 vec.insert(vec.end(), {4, 5}); // 尾部插入多个元素
2. 删除元素
- 尾部删除(O(1)):
vec.pop_back(); // 删除最后一个元素
- 任意位置删除(O(n)):
vec.erase(vec.begin() + 1); // 删除索引1处元素 vec.erase(vec.begin(), vec.begin() + 2); // 删除前2个元素 vec.clear(); // 清空所有元素(容量不变)
3. 修改元素
随机访问修改(O(1)):
vec[0] = 100; // 无边界检查
vec.at(1) = 200; // 有边界检查(越界抛异常)
4. 查询元素
int first = vec.front(); // 首元素
int last = vec.back(); // 末元素
int third = vec[2]; // 索引2处元素(无检查)
int fourth = vec.at(3); // 索引3处元素(有检查)
⚠️ 性能警告:避免在头部/中间频繁插入删除,优先选择尾部操作!
三、判空操作:避免逻辑错误
1. 一维Vector判空
使用empty()
代替size()==0
(效率更高):
if (vec.empty()) {std::cout << "Vector is empty!";
}
2. 二维Vector判空
需检查外层和内层容器:
bool isMatrixValid(const vector<vector<int>>& mat) {if (mat.empty()) return false; // 外层空for (const auto& row : mat) {if (row.empty()) return false; // 内层存在空行}return true;
}
四、比较操作:规则与示例
比较规则:
-
==
/!=
:元素数量相同且对应位置值相等 -
<
/<=
/>
/>=
:按字典序逐元素比较
代码示例:
std::vector<int> a = {1, 2, 3};
std::vector<int> b = {1, 2, 4};cout << (a == b ? "Equal" : "Not equal"); // 输出:Not equal
cout << (a < b ? "a < b" : "a >= b"); // 输出:a < b(因 3 < 4)
五、二维数组:动态实现方案
1. 初始化固定行列
vector<vector<int>> matrix(3, vector<int>(4)); // 3行4列,默认值0
vector<vector<int>> matrix(2, vector<int>(3, -1)); // 2行3列,初始值-1
2. 动态添加行/列
matrix.push_back(vector<int>(5, 0)); // 添加一行5个0
matrix[0].resize(6); // 第一行扩展至6列
3. 遍历与访问
for (size_t i = 0; i < matrix.size(); ++i) {for (size_t j = 0; j < matrix[i].size(); ++j) {cout << matrix[i][j] << " ";}cout << endl;
}
💡 适用场景:需动态调整行列数时优先使用,固定大小数组建议用原生数组。
总结:Vector核心要点
维度 | 关键点 | 性能提示 |
---|---|---|
初始化 | 预分配空间避免多次扩容 | 用reserve() 减少内存重分配 |
增删改查 | 尾部操作高效,中间操作昂贵 | 优先用emplace_back 替代push_back |
判空 | 多维容器需检查内层空 | 用empty() 而非size()==0 |
比较 | 字典序逐元素比较 | 确保元素类型支持比较操作 |
二维数组 | 灵活但内存非完全连续 | 固定大小时考虑原生数组 |