【C++修炼秘籍】STL-Vector
☀️心有所向,日复一日,必有精进
☀️专栏《C++修炼秘籍》
☀️作者:沂沐沐
☀️如果有错误,烦请指正,如有疑问可私信联系;
目录
前言
vector的数据安排以及操作方式,与array非常相似,就像数组一样,vector采用连续的存储空间,可以像数组一样的随机访问,但是又不像数组一样,它的大小是可以随意改变的,而且是自动处理;有了vector后,相比于C语言的数组使用要方便许多,接下来让我们深入了解一下;
一、vector介绍
vector动态开辟空间,是可变大变小的数组序列容器;
像数组一样随机访问;
vector的动态分配策略:
分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小
所以vector在对空间进行管理的时候扩容一般是异地扩容,代价比较高,尽量避免扩容减少扩容,缩容是几乎不可能缩容的;但是有缩容函数shrink_to_fit()缩容函数(不建议使用、代价很大,异地缩容;)
例如:
reserve不会缩容,缩容是有代价的,以空间换时间;
resize()不会缩容,只是改size;
vector<char>和string 是有一定区别:没有“\0",接口不一样;
二、vector的使用/接口介绍
vector的构造
(constructor)构造函数声明 | 接口说明 |
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
vector迭代器
iterator的使用 | 接口说明 |
begin + end(重点) |
获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置 的iterator/const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的 reverse_iterator |
迭代器我们可以知道他可以遍历STL的容器,vector也可以使用[]像数组那样访问,但是List地址不连续怎么像数组那样访问;
下面是vector的三种访问方式:
vector<int> vv = {2,3,5,7,1,5,0};
vector<int>::iterator it = vv.begin();
cout << "迭代器方式" << endl;
while (it != vv.end())//迭代器方式
{
cout << *it << " ";
it++;
}
cout << endl;
cout << "[]访问方式" << endl;
for (int i = 0; i < vv.size(); i++)//[]访问方式
{
cout << vv[i] << " ";
}
cout << endl;
cout << "范围for方式" << endl;
for (auto e : vv)//范围for方式
{
cout << e << " ";
}
范围for其实底层就是对迭代器的简单替代;
vector 空间管理
容量空间 | 接口说明 |
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |