1. 头文件 < vector >
2. vector是什么
2.1 原理
- std::vector是封装动态数组的顺序容器
- 元素相继存储,不仅可以用迭代器,还可以用元素的常规指针访问元素
- 不再每次插入元素时,只在额外内存耗尽时重分配,内存总量可用capacity()函数查询
2.2 复杂度
- 随机访问:O(1)
- 末尾插入或移除元素:O(1)
- 插入或移除元素:O(n)
3. 常用函数
3.1 赋值函数
赋值函数 | 作用 |
---|
operator= | 赋值给容器 |
assign | 将值赋给容器 |
vector<int> v;
v = {1, 2, 3, 4, 5};
v2.assign(v.begin(), v.begin()+3);
for(int n : v2){
cout<<n<<' ';
}
cout<<endl;
v2.assign(5, 8);
for(int n : v2){
cout<<n<<' ';
}
cout<<endl;
3.2 元素访问
元素访问 | 作用 |
---|
at | 访问指定元素,同时进行越界检查 |
operator[] | 访问指定元素 |
front | 访问第一个元素 |
back | 访问最后一个元素 |
data | 返回指向内存中数组第一个元素的指针 |
cout<< v.at(0) <<endl;
cout<< v.front() <<endl;
cout<< v.back() <<endl;
cout<< v.data() <<endl;
3.3 迭代器
迭代器 | 作用 |
---|
begin | 返回指向容器第一个元素的迭代器 |
end | 返回指向容器尾端的迭代器 |
rbegin | 返回指向容器最后元素的逆向迭代器 |
rend | 返回指向前端的逆向迭代器 |
vector<int> v3 = {1, 2, 3, 4, 5};
vector<int>::iterator iter;
vector<int>::reverse_iterator riter;
for(iter=v3.begin(); iter!=v3.end(); ++iter){
cout<<*iter<<' ';
}
cout<<endl;
riter = v3.rbegin();
for(riter=v3.rbegin(); riter!=v3.rend(); ++riter){
cout<<*riter<<' ';
}
cout<<endl;
3.4 容量
容量 | 作用 |
---|
empty | 检查容器是否为空 |
size | 返回容纳的元素数 |
max_size | 返回可容纳的最大元素数 |
reserve | 预留存储空间 |
capacity | 返回当前存储空间能够容纳的元素数 |
vector<int> v4 = {2, 4, 6, 8, 10};
cout<<v4.empty()<<endl;
cout<<v4.size()<<endl;
cout<<v4.max_size()<<endl;
v4.reserve(8);
cout<<v4.size()<<endl;
cout<<v4.capacity()<<endl;
for(iter=v4.begin(); iter!=v4.end(); ++iter){
cout<<*iter<<' ';
}
3.5 修改器
修改器 | 作用 |
---|
clear | 清除内容 |
insert | 插入元素 |
erase | 擦除元素 |
push_back | 将元素添加到容器末尾 |
pop_back | 移除末尾元素 |
vector<int> v5 = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
v5.insert(v5.begin()+2, 3, 5);
for(int n:v5) { cout<<n<<' '; } cout<<endl;
v5.erase(v5.begin()+3);
for(int n:v5) { cout<<n<<' '; } cout<<endl;
v5.erase(v5.begin()+3, v5.begin()+5);
for(int n:v5) { cout<<n<<' '; } cout<<endl;
v5.push_back(6);
for(int n:v5) { cout<<n<<' '; } cout<<endl;
v5.pop_back();
for(int n:v5) { cout<<n<<' '; } cout<<endl;