1. vector 的构造
vector 需要显式实例化类模版,在创建 vector 类型的容器时可以直接创建,也可以进行初始化,例如 v2 ,也可以使用迭代器的方式创建,具体关于更多vector的知识: vector

//模版类只能显式实例化
vector<int> v1;
vector<int> v2(10, 1);
//迭代器初始化
vector<int> v3(v2.begin(), v2.end());2. vector 的遍历
vector 与 string 类有着异曲同工之妙,并且做了更多的优化,所以在学习了 string 类之后再来学习 vector 就会简单很多,关于 vector 的遍历也与 string 类很相似,具体介绍可以移步到 面向对象程序设计(C++)之 string 类
2.1 下标遍历
	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//1.下标遍历
	for (size_t i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
	2.2 迭代器遍历
	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//2.迭代器遍历
	vector<int>::iterator it = v2.begin();
	while (it != v2.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	2.3 范围 for 遍历
	//模版类只能显式实例化
	vector<int> v1;
	vector<int> v2(10, 1);
	//迭代器初始化
	vector<int> v3(v2.begin(), v2.end());
	//3.范围 for 遍历
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;3. vector 的扩容机制
这里借助插入100个数据来判断 vector 的扩容机制,我们由下图可知在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,当然我们可以使用 reserve 接口来提前保存一部分空间减少扩容次数,需要注意的是 vector 与 string 不同,string 的 reverse 接口如果给出的值小于原来的容量那么就是一个无约束的,可能会缩容;但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会影响,即不会缩容(VS 与 g++ 环境均不会缩容)
void TestVectorExpend()
{
	size_t sz;
	vector<int> v;
	sz = v.capacity();
	cout << "capacity changed :" << sz << "\n";
	cout << "make a grow" << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "capacity changed :" << sz << "\n";
		}
	}
}VS 环境下扩容

g++环境下扩容
 
4. vector 的常用接口
4.1 resize 接口
resize 接口是在原来 vector 对象的基础上进行添加数据,当然有两种情况,一种是给定的添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变);第二种情况就是大于size的值,就会根据给定的值来扩容(这里只讨论VS环境下的情况)
vector<int> v(10, 1);
cout << v.size() << endl;
cout << v.capacity() << endl;
//1.小于size
v.resize(5, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
//2.大于size
v.resize(15, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
4.2 push_back 接口
可以进行尾插,通常 vector 支持迭代器插入
vector<int> v(10, 2);
//1.尾插
v.push_back(10);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;4.3 insert 接口
在指定位置插入数据,通常 vector 支持迭代器插入,但是没有明确的头插,但是使用insert可以进行头插
vector<int> v(10, 2);
//2.头插
v.insert(v.begin(), 1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
//3.在第三个位置进行插入
v.insert(v.begin() + 3, 1);
for (auto e : v)
{
	cout << e << " ";
}4.4 erase 接口
删除指定位置的数据或者删除指定区间的数据,没有头删的接口可以使用 erase 接口进行头删
vector<int> v(10, 2);
//4.头删
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
//5.删除第三个位置的数据
v.erase(v.begin() + 3);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;4.5 流插入与流提取
与 string类不同的是 vector 不支持流插入与流提取,但是可以自己设计,更加灵活
vector<int> v(10);
for (size_t i = 0; i < v.size(); i++)
{
	cin >> v[i];
}
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;5. vector 的不同类型元素
5.1 vector<int>
存放整数类型
//10个1
vector<int> v1(10, 1);
5.2 vector<char>
存放字符类型
//10个'a'
vector<char> v2(10, 'a');5.3 vector<vector<int>>
二维数组存放整数类型
	//二维数组
	vector<int> v(5, 1);//5个元素的一维数组
	vector<vector<int>> vv(10, v);//10行5列的二维数组
	//使用下标遍历二维数组
	for (int i = 0; i < vv.size(); i++)
	{
		for (int j = 0; j < v.size(); j++)
		{
			cout << vv[i][j] << " ";
		}
		cout << endl;
	}










![[NSSCTF 2022 Spring Recruit]babyphp](https://i-blog.csdnimg.cn/direct/50681e1eca3d4aa78e71e77aad6e666b.png)








