c++初阶-----STL---vector

发布于:2024-04-28 ⋅ 阅读:(27) ⋅ 点赞:(0)

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


初始vector

  1. vector是表示可变大小数组的序列容器
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小,为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好
  7. 简单来说就是一个顺序表

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;
}

在这里插入图片描述