C++初阶学习第十弹——深入讲解vector的迭代器失效

06-01 1488阅读

C++初阶学习第八弹--深入解析vector的使用-CSDN博客

 C++初阶学习第九弹-----vector的模拟实现-CSDN博客

     

目录

     

一.前言

二.迭代器失效的本质

2.1 迭代器失效 ------ 扩容导致的野指针

2.2迭代器失效 ------ 迭代器指向的位置意义发生改变

​编辑三. erase迭代器失效

 四.vector的迭代器失效总结


一.前言

近期我们学习了vector的模拟实现和一些使用方法,接下来我们学习了解vector的迭代器的失效问题。

二.迭代器失效的本质

迭代器失效:实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。具体的可以用一下三步来说明:

[1]迭代器的本质就是指针,迭代器失效就是指针失效。
[2]指针失效:指针指向的空间是非法的。
[3]指针指向非法空间:指向了被释放的空间 或者 越界访问 。

2.1 迭代器失效 ------ 扩容导致的野指针

错误示范:

void insert(iterator pos, const T& x)
{
	//检测参数合法性
	assert(pos >= _start && pos = pos)
	{
		*(end + 1) = *(end);
		end--;
	}
	//把值插进去
	*pos = x;
	_finish++;
}

修改过的代码:

当我们进行尾插的时候,如果空间不够了,会进行reserve扩容,扩容之后_finish和_start都会进行改变,pos就成为了野指针,改变的方法也很简单,在扩容之前记录一个_start和pos的相对位置。

等到扩容之后再重新更新pos的位置。

iterator insert(iterator pos, const T& x)
{
	//扩容
	if (_finish == _end_of_storage)
	{
		size_t len= pos - _start;
		reserve(capacity() == 0 ? 4 : capacity() * 2);
		pos = _start + len;
	}
	iterator end = _finish - 1;
	while (end >= pos)
	{
		*(end + 1) = *end;
		end--;
	}
	*end = x;
	_finish++;
	return pos;
}

C++初阶学习第十弹——深入讲解vector的迭代器失效

2.2迭代器失效 ------ 迭代器指向的位置意义发生改变

 void test2()
{
	xas_vector::vector v1;
	v1.Push_back(1);
	v1.Push_back(2);
	v1.Push_back(3);
	v1.Push_back(4);
	v1.Push_back(5);
	v1.Push_back(6);
	for (auto ch : v1)
	{
		cout 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码