c++ STL之vector

vector
容器,底层为一个数组。与array十分相似。但是array是静态空间,而vector是一个动态的空间。这就是为什么vector的方法中有容量(capacity)和大小(size)的两个方法。本文将会对这两个方法进行区分。

初始化

    vector<int> a = { 1,2,3,4,5,6 };//定义一个类型为int类型的容器a,并且初始化为1~6
	vector<int> b(10);//定义一个容器大小为10的b容器,初始值不确定
	vector<int> c(2, 3);//定义一个int类型的容器c,初始化为2个3
	vector<int> d(c);//用c对b进行拷贝构造
	vector<int> e(c.begin(), c.end());//用c对e进行赋值

获取元素
地址连续,支持下标形式获取元素

vector<int> a = { 1,2,3,4,5,6 };
	cout << "发挥a的第一个元素: " << a.front() << endl;
	cout << "返回a的最后一个元素: " << a.back() << endl;
	int i = 3;
	if (i < a.size())
	{
		cout << "返回a的第i个元素: " << a[i] << endl;
	}

增删操作

    vector<int> a = { 1,2,3,4,5,6 };
	a.clear();//清空整个容器
	a.erase(a.begin(), a.end() - 1);//删除从第一个到倒数第二个的元素
	a.pop_back();//删除容器中最后一个元素
	a.push_back(2);//在容器最后位置插入元素2
	a.insert(a.begin(), 3);//在a的头部插入元素3
	a.insert(a.begin(),4, 3);//在a的头部插入四个3

常用算法

    vector<int> a = { 1,2,3,4,5,6,5 };
	reverse(a.begin(), a.end());//翻转数组
	sort(a.begin(), a.end());//将a从小到大进行排列
	//查询5第一次出现的位置,返回类型为vector<int>::iterator迭代器,c++11中新标准允许使用auto接取返回值
	auto i = find(a.begin(), a.end(), 9);
	cout << *i << endl;//接取的i为地址,需要取地址上的值

遍历方法

    vector<int> a = { 1,2,3,4,5,6,5 };
	//1
	for (vector<int>::iterator iter = a.begin();iter != a.end();iter++)
	{
		cout << *iter;
	}
	cout << endl;
	//2
	for (size_t i = 0;i < a.size();i++)
	{
		cout << a[i];
	}
	cout << endl;
	//3
	for (int& i : a)//c++11 for循环新语法
	{
		cout << i;
	}
	cout << endl;

size和capacity

    vector<int> a(4, 8);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

	a.push_back(1);
	cout << "size = " << a.size() << endl;
	cout << "capacity = " << a.capacity() << endl;

在这里插入图片描述

在这个容器中我们将容器的size初始化大小为4,那么很明显容量也为4。当进行插入一个元素时,size增加了1,容量增加了原容器4的一半2。当大小和容量在此相等时,继续插入容量又是增加了原容器6的一半3。所以我们可以从这里得出结论:当原容器的容量不足以新插入元素,vector会重新寻找一块内存地址,大小为原容器容量的1.5倍(VS2019环境下,每个编译器中可能开辟的新内存空间大小不同)。再销毁原来的内存空间。再数据量较大的情况下,vector的使用效率较低,并可能引发迭代器的失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值