C++ vector 超全用法整理
C++ vector 超全用法整理
一、头文件与定义
#include <vector>
using namespace std;
常见定义方式:
vector<int> v1; // 空 vector
vector<int> v2(5); // 5 个元素,默认 0
vector<int> v3(5, 10); // 5 个 10
vector<int> v4 = {1,2,3,4,5}; // 初始化列表
vector<int> v5(v4); // 拷贝构造
vector<int> v6(v4.begin(), v4.end()); // 迭代器构造
二、访问元素
v[i] // 访问第 i 个元素(不检查越界)
v.at(i) // 访问第 i 个元素(会抛越界异常)
v.front() // 第一个元素
v.back() // 最后一个元素
v.data() // 返回底层数组指针 int*
三、添加元素
v.push_back(x); // 尾部添加
v.emplace_back(x); // 尾部原地构造(效率更高,推荐刷题用)
v.insert(pos, x); // 在迭代器 pos 前插入 x
v.insert(pos, n, x); // 在 pos 前插入 n 个 x
v.insert(pos, begin, end); // 插入另一个区间
示例:
v.insert(v.begin() + 2, 99);
四、删除元素
v.pop_back(); // 删除最后一个
v.erase(pos); // 删除迭代器 pos 处元素
v.erase(begin, end); // 删除区间 [begin,end)
v.clear(); // 清空所有元素
五、大小与容量
v.size(); // 实际元素个数
v.empty(); // 是否为空(true/false)
v.resize(n); // 调整大小为 n,多删少补 0
v.resize(n, x); // 调整大小为 n,新元素用 x 填充
v.capacity(); // 容量(可存多少不扩容)
v.reserve(n); // 预分配 n 个空间,不构造对象
v.shrink_to_fit(); // 释放多余容量,size = capacity
六、遍历方式
1. 普通 for
for(int i=0; i<v.size(); i++)
cout << v[i];
2. 范围 for(C++11)
for(auto x : v)
cout << x;
3. 迭代器
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it;
简写:
for(auto it = v.begin(); it != v.end(); it++)
七、排序、去重、反转
#include <algorithm>
sort(v.begin(), v.end()); // 升序
sort(v.rbegin(), v.rend()); // 降序
reverse(v.begin(), v.end()); // 反转
unique(v.begin(), v.end()); // 去重(必须先排序)
常用去重写法:
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
八、查找
auto it = find(v.begin(), v.end(), x);
if(it != v.end())
// 找到
九、比较
v1 == v2
v1 != v2
v1 < v2 // 字典序比较
十、二维 vector
vector<vector<int>> mat(3, vector<int>(4, 0));
遍历:
for(auto &row : mat){
for(auto x : row)
cout << x;
}
十一、常用技巧
- 清空并释放内存
vector<int>().swap(v);
- 判断是否存在某个元素
if(find(v.begin(),v.end(),x) != v.end())
- vector 转数组
int *p = v.data();
- 删除满足条件的元素
v.erase(remove_if(v.begin(),v.end(),[](int x){return x<0;}), v.end());
十二、所有函数速查表
begin()/end()rbegin()/rend()cbegin()/cend()size()max_size()resize()capacity()empty()reserve()shrink_to_fit()operator[]at()front()back()data()assign()push_back()emplace_back()pop_back()insert()erase()swap()clear()emplace()
1648



被折叠的 条评论
为什么被折叠?



