vector迭代器的使用以及迭代器失效

一、iterator的使用注意

begin与end

        遵循左闭右开的原则,begin  指向vector的第一个元素,end  指向vector的最后一个元素的往下一个位置。

 rbegin 与 rend

        rbegin指向最后一个元素的位置,rend指向第一个元素的往前一个位置。

二、vector的常用接口 

常用接口如下,不一一运行查看结果了,直接粘贴到本地运行看一下就懂了

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

int main()
{
	vector<int>v;
	for (int i = 1; i < 10; i++)
	{
		//尾插
		v.push_back(i);
	}
	for (auto e : v)
	{
		cout << e << " ";
	}

	cout << endl;

	//获取vector的个数
	cout << v.size() << endl;

	//获取vector的容量大小
	cout << v.capacity() << endl;

	//判空
	bool emp = v.empty();
	cout << emp << endl;

	//改变vector的size
	v.resize(200);
	cout << v.size()<<endl;

	//改变vector的capacity
	v.reserve(300);
	cout << v.capacity() << endl;

	//insert,在某个位置之前插入
	vector<int>v1 = { 1,2,3,4,5 };
	v1.insert(v1.begin()+1, 100);
	for (auto e : v1)
	{
		cout << e<<" ";
	}
	cout << endl;

	//find查找,算法模块实现,不是vector的成员接口
	auto it = find(v1.begin(), v1.end(), 5);
	if (it != v1.end())
	{
		cout << "找到了" << endl;
	}

	//erase,删除指定位置元素
	auto pos = v1.begin() + 1;
	v1.erase(pos);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	//对[]的重载,使vector能像数组那样访问
	cout << v1[0] << endl;


	return 0;
}

三、迭代器失效问题

首先我们需要记住一句话:迭代器的底层是一个指针

如果指针所指向的空间被销毁的,那么该指针就是一个野指针了,那么以该指针为底层的迭代器自然就失效了

resize、reserve、insert、 assign、push_back等都有可能会造成迭代器失效的问题

以下面的代码为例:

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

	//原本的vector空间有可能不足,那么会进行扩容
	//旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,
	//实际操作的是一块已经被释放的空间,而引起代码运行时崩溃
	
	//用100个8来填充该vector
	v.resize(100, 8);
	//v.reserve(100);将容量扩大到100,但是有效个数还是不变的
	// v.insert(v.begin(), 0);如果有效个数=最大容量,此时插入可能会造成迭代器失效
	//v.push_back(8);
	//v.assign(100, 8);//对该vector重新赋值

	//如何解决:让it重新指向vector即可,那样无论是否释放原本的空间,迭代器都指向当前的空间

	//it = v.begin();    这步是解决迭代器失效问题

	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值