C++入门:STL_容器_vector的使用

使用条件

首先,如果你想使用STL_容器_vector,头文件应该写成这样:

#include <iostream>
#include <vector>
using namespace std;

向量初始化

void main()
{
	vector<int> v0;
	vector<int> v1(10);

	for (int i = 0; i < v1.size(); ++i)
		cout << v1[i] << " ";
	cout << endl;

	for (auto& e : v1)
		cout << e << " ";
	cout << endl;

	vector<int>::iterator it = v1.begin();
	while (it != v1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

在这里插入图片描述

正向迭代器和反向迭代器

void main()
{
	int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	vector<int> v1(ar, ar + 10);
	
	vector<int>::iterator it = v1.begin();//正向迭代器迭代
	while (it != v1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	vector<int>::reverse_iterator rit = v1.rbegin();//反向迭代器迭代
	while (rit != v1.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
}

在这里插入图片描述

向量的大小和向量的容量

void main()
{
	int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	vector<int> v1(ar, ar + 10);

	cout << "v1_size="<<v1.size() << endl;//计算顺序表大小
	cout << "v1_capacity=" << v1.capacity() << endl;//计算顺序表容量
}

在这里插入图片描述

修改大小和容量

void main()
{
	vector<int> iv;
	iv.push_back(1);
	iv.push_back(2);
	iv.push_back(3);
	iv.push_back(4);
	iv.push_back(5);
	iv.push_back(6);
	iv.push_back(7);

	cout << "size = " << iv.size() << endl;
	cout << "capacity = " << iv.capacity() << endl;

	iv.resize(10);//扩大顺序表大小
	//iv.reserve(8);//扩大容量大小

	cout << "size = " << iv.size() << endl;
	cout << "capacity = " << iv.capacity() << endl;
}

在这里插入图片描述

void main()
{
	vector<int> v1(5, 2);

	v1.resize(10, 3);//扩大顺序表大小,多余的用3补上

	cout << "size = " << v1.size() << endl;
	cout << "capacity = " << v1.capacity() << endl;

	for (int i = 0; i<v1.size(); ++i)
		cout << v1[i] << " ";
	cout << endl;
}

在这里插入图片描述

void main()
{
	vector<int> v1(5, 1);

	v1.reserve(100);//这里首先将顺序表定好容量,就避免了进行太多的扩容操作

	for (int i = 1; i <= 100; ++i)
	{
		v1.push_back(i);
		cout << "capacity = " << v1.capacity() << endl;
	}
	//对于一个顺序表来说,容量在初始化的时候是有限的,但是,当插入的元素越来越多的时候,
	//顺序表的容量小于了顺序表的大小,顺序表就要开始扩容,这个扩容工作可不是简单地在顺序表后面开辟空间
	//扩容的步骤:①先开辟一个足以放下所有元素的新空间②将旧空间的元素复制到新空间③添加新元素
	//④将旧空间的指针指向新空间⑤释放旧空间
	//可以看出扩容是一个很费时间的操作,所以一般我们在一开始,就将顺序表的容量合理地定好是很重要的
}

在这里插入图片描述

插入数据

void main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);

	v1.insert(v1.begin(), 10);//10 1 2。在pos位置之前插入

	vector<int>::iterator pos = find(v1.begin(), v1.end(), 1);
	v1.insert(pos, 20);//10 20 1 2

	for (int i = 0; i<v1.size(); ++i)
		cout << v1[i] << " ";
	cout << endl;
}

在这里插入图片描述

at()函数和越界问题

void main()
{
	int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int n = sizeof(ar) / sizeof(ar[0]);
	vector<int> iv(ar, ar + n);

	for (int i = 0; i <= iv.size(); ++i)
		//cout<<iv[i]<<" ";
		cout << iv.at(i) << " ";//at函数会进行越界检测,但是[]不会
	cout << endl;
}

在这里插入图片描述

扩容之后的迭代器失效问题

void main()
{
	int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int n = sizeof(ar) / sizeof(ar[0]);
	vector<int> iv(ar, ar + n);

	cout << "size = " << iv.size() << endl;
	cout << "capacity = " << iv.capacity() << endl;

	//iv.reserve(20);//这里如果将顺序表的容量扩容为20,在下面尾插20的时候,就不会发生扩容,it也不需要进行重新赋值就能访问

	auto it = find(iv.begin(), iv.end(), 5);
	cout << "*it = " << *it << endl;

	iv.push_back(20);
	//迭代器失效问题,可以看出iv是一个大小为十,容量为十的顺序表。
	//通过find找到了5的位置,赋给it,这里尾插一个20,超出了容量所以需要扩容
	//通过前面我们知道,扩容是重新开辟空间,重新定位指针的,所以这里再对it进行访问,就会发生迭代器失效的问题
	//所以我们需要对it重新进行赋值才能访问成功

	it = find(iv.begin(), iv.end(), 5);

	cout << "*it = " << *it << endl;

}

在这里插入图片描述

erase和非法访问问题

int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

	vector<int>::iterator pos = find(v.begin(), v.end(), 3);

	auto it=v.erase(pos);
	//cout << *pos << endl; // 此处会导致非法访问
	cout << *it << endl;//删除完之后,指针位置不发生改变,而是后面的元素赋值给删除的元素

	for (int i = 0; i<v.size(); ++i)
		//cout<<iv[i]<<" ";
		cout << v.at(i) << " ";
	cout << endl;

	return 0;
}

在这里插入图片描述

删除数组中偶数的问题

int main()
{
	vector<int> v{ 1, 2, 3, 4 };
	auto it = v.begin();

	while (it != v.end())
	{
		if (*it % 2 == 0)
		{
			it = v.erase(it);
		}
		else
			++it;
	}//删除了顺序表里面的偶数
	//过程:①一开始数值是1,指针向后移动指向2。
		//  ②之后2是偶数,删除之后指针不发生移动。后面的元素前移,顺序表现在是1 3 4,it指针指向3
	    //  ③由于元素是3,所以指针向后移动指向4。
		//  ④4是偶数删除,指针不发生改变,后面的元素前移,顺序表现在是1 3。it还是指向4,不过这个时候已经没有意义了,因为每erase一次,向量最后的last指针会--。
	//cout << *it << endl;//空指针不能访问
	for (int i = 0; i<v.size(); ++i)
		cout << v[i] << " ";
	cout << endl;
	return 0;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值