嗨~大家好,这里是春栀怡铃声的博客~
“做你害怕的事,然后发现,不过如此~”
目录
创建vector
遍历方法
迭代器
reserve 扩容
resize 对size 进行改变 会加值,会减值
insert
size
capacity
empty
push_back
erase
swap
clear
创建vector
vector<int>v2(10, 2); vector<int> v1; vector<int>v3(++v2.begin(), --v2.end()); //迭代器创建遍历方法
范围for由2部分组成,冒号前面是范围内用于迭代的变量,第二变量则表示被迭代的范围
自动读取数据,自动结束
vector<int>v3(10,2); for (auto e : v3) { cout << e<<" "; } cout << endl;下标访问
//下标访问 for (size_t i = 0; i < v3.size(); i++) { cout << v3[i]<<" "; } cout << endl;迭代器
vector 的迭代器可以理解成“指向元素的通用指针”,用来遍历和操作容器里的元素。
常用接口
vector<int> v (10,2);
auto it = v.begin(); // 指向第一个元素
auto ed = v.end(); // 指向最后一个元素的后一个位置
遍历
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << ' ';
}
常见特性
- *it 取值
- ++it 前进
- it + n、it - n:因为 vector 的迭代器是随机访问迭代器
- it1 < it2:可比较位置先后
- it[n]:等价于 *(it + n)
只读迭代器
vector<int>::const_iterator cit = v.cbegin();
const_iterator 不能修改元素。
反向迭代器
for (auto it = v.rbegin(); it != v.rend(); ++it) { std::cout << *it << ' '; }迭代器遍历
//迭代器遍历 vector<int>::iterator it = v3.begin(); //auto it=v3.begin(); while (it != v3.end()) { cout << *it<<" "; ++it; } cout << endl;reserve 扩容
提前开好空间
像下面的示例:创建了string 类 的tmp ,想让tmp 拥有和s1一样大的空间存放数据
使用reserve 开出空间
a. reserve(n) && n<capacity在vector 中明确不会缩容;
在string (gcc) 会缩容,string(vs.2022) 不会缩容
vector<int>v(10, 2); v.reserve(5); cout << v.size() << endl; cout << v.capacity() << endl; v.reserve(20); cout << v.size() << endl; cout << v.capacity() << endl;初始有效数据有10个,空间大小也为10
第一次reserve(5) 5<10 ,无需扩容,并且不会缩小空间大小 空间大小和有效数据都不变
第二次reserve(20) 需要扩容,空间大小变为20,有效数据不变
resize 对size 进行改变 会加值,会减值
vector<int>v(10, 2); v.resize(5); cout << v.size() << endl; cout << v.capacity() << endl; v.resize(15,6); cout << v.size() << endl; cout << v.capacity() << endl; v.resize(20, 3); cout << v.size() << endl; cout << v.capacity() << endl;初始位置有效数据有10个,空间大小为10
经过第一次resize(5) 有效数据缩减到5,空间大小不变
第二次resize(15,6) 有效数据加到15,空间也扩大到15,新增的有效数据都是6
第三次 resize(20,3) 有效数据加到20,空间扩容到22, 新增的有效数据都是3
insert
insert 只能传迭代器
第一个参数代表指向位置插入,第二个参数代表插入的值
void text_vector5() { vector<int>v(10, 2); v.insert(v.begin(), 4); v.insert(v.begin() + 3, 6); //可以通过迭代器加来进行随机位置插入 for (auto e : v) { cout << e << " "; } cout << endl; }size
返回的是v1的有效数据个数
使用
v1.size();
capacity
返回的是v1的空间大小
v1.capacity();
empty
返回v1是否为空的判断值,是空返回true ,不是空返回false
push_back
使用push_back 在v1末尾插入
vector<int>v1; v1.push_back(5);erase
erase 只能传迭代器
一种用法是直接删除传入迭代器指向的位置的值
另一种是删除第一个迭代器到第二个迭代器的范围中的值
vector<int>v1(10,2); v1.erase(v1.begin()); for (auto e : v1) { cout << e<<" "; } cout << endl; v1.erase(--v1.end()); for (auto e : v1) { cout << e<<" "; } cout << endl;swap
• vector 的 swap 用来交换两个 vector 的内容,时间复杂度通常是 O(1)。
用法
#include <iostream> #include <vector> using namespace std; int main() { vector<int> a = {1, 2, 3}; vector<int> b = {4, 5}; a.swap(b); for (int x : a) cout << x << " "; // 4 5 cout << endl; for (int x : b) cout << x << " "; // 1 2 3 cout << endl; }交换后:
- a 变成原来 b 的内容
- b 变成原来 a 的内容
包括:
- 元素内容
- size()
- capacity()
clear
只删除v1中的数据,v1的空间大小不变