嗨~大家好,这里是春栀怡铃声的博客~

"做你害怕的事,然后发现,不过如此~"
目录
[reserve 扩容](#reserve 扩容)
[resize 对size 进行改变 会加值,会减值](#resize 对size 进行改变 会加值,会减值)
创建vector
cpp
vector<int>v2(10, 2);
vector<int> v1;
vector<int>v3(++v2.begin(), --v2.end()); //迭代器创建
遍历方法
范围for由2部分组成,冒号前面是范围内用于迭代的变量,第二变量则表示被迭代的范围
自动读取数据,自动结束
cpp
vector<int>v3(10,2);
for (auto e : v3)
{
cout << e<<" ";
}
cout << endl;
下标访问
cpp
//下标访问
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 不能修改元素。
反向迭代器
cpp
for (auto it = v.rbegin(); it != v.rend(); ++it)
{
std::cout << *it << ' ';
}
迭代器遍历
cpp
//迭代器遍历
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 开出空间
cpp
a. reserve(n) && n<capacity
在vector 中明确不会缩容;
在string (gcc) 会缩容,string(vs.2022) 不会缩容
cpp
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 进行改变 会加值,会减值
cpp
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 只能传迭代器
第一个参数代表指向位置插入,第二个参数代表插入的值
cpp
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末尾插入
cpp
vector<int>v1;
v1.push_back(5);
erase

erase 只能传迭代器
一种用法是直接删除传入迭代器指向的位置的值
另一种是删除第一个迭代器到第二个迭代器的范围中的值
cpp
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)。
用法
cpp
#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的空间大小不变