作者前言
🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂
vector
- **作者前言**
- 初始vector
- vector的使用
- 构造函数
- 成员函数
- shrink_to_fit
- vector没有的成员函数
- find
初始vector
- vector是表示可变大小数组的序列容器。
- 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
- 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小,为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
- vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
- 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
- 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好
- 简单来说就是一个顺序表
vector的使用
vector页面
我们需要先理解一下怎么定义一个vector对象,可以看出,这是一个类模板,我们知道可以使用typename也可以使用class来,
有类模板有两个参数,分别是类型参数 T和 模板参数Alloc,Alloc也就是allocator,我们都知道这些参数都是类型
所以,我们只要显示实例化一个类型就可以;
vector<int> sep;
vector就是sep对象的类型,
构造函数
需要注意一下:
value_type就是T, 例如,对于一个 std::vector,value_type 就是 int;对于一个 std::vector<std::string>,value_type 就是 std::string。
allocator_type就是Alloc
这些构造函数,allocator_type类型的参数都进行赋值了
所以可以进行的构造可以是
int main()
{
vector<int> sep0;
vector<int> sep1(5,10);
for (auto e : sep1)
{
cout << "sep1:" << e << " ";
}
cout << endl;
vector<int> sep2(sep1.begin(), sep1.end());
for (auto e : sep2)
{
cout<<"sep2:" << e << " ";
}
cout << endl;
vector<int> sep3(sep2);
for (auto e : sep2)
{
cout << "sep3:" << e << " ";
}
cout << endl;
return 0;
}
成员函数
跟前面的string的一样,有迭代器,有大小这些成员函数,
这些成员函数,这里就不多去些了,需要使用的时候可以去查查
迭代器的指向
还有一些是需要去介绍的
这里我就介绍一下resize,
我们和前面的string比较一下
string:
vector:
```powershell
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v(100,1);
cout << v.size() << endl;
cout << v.capacity() << endl;
v.resize(10, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
for (int e : v)
{
cout << e;
}
return 0;
}
resize的作用不仅仅是把容量扩大,更是填满全部的空间,如果扩大到的长度小于原来的长度就会缩小(指的是字符串长度,容量是不会缩小的),和reserve相比,reserve仅仅是把目前的空间扩大到指定的长度,如果小于原来的长度就不会缩小,
对比效果:
可以看到,一样的代码,但是效果是不一样的,
如果要缩小容量的话可以使用shrink_to_fit
shrink_to_fit
把容量扩大或者缩小到和当前填充的内容的大小一致
vector没有的成员函数
find
我们发现vector容器里面没有find这个成员函数,但是std::find有,我们可以去使用
这个函数是在std里面的
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
int i = 0;
for (i = 0; i < 100; i++)
{
v.push_back(i);
}
auto pos = std::find(v.begin(), v.end(), 10);
if (pos == v.end())
{
cout << "NO" << endl;
}
else
{
cout << "YES" << endl;
}
return 0;
}