C++从零开始的打怪升级之路(day27)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于vector,这篇博客内容紧跟上一篇

1.迭代器失效

2.删除型

我们来看下面的代码

void Test1()
{
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	vector::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
		{
			v.erase(it);
		}
		else
		{
			++it;
		}
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

思路是用迭代器遍历vector删除偶数数据,看起来也没什么问题,但是运行起来会发现程序崩溃了,这是因为删除之后再走到while条件判断使,vs编译器会检测出来迭代器失效了,终止程序(注意这件事情是编译器做的,有的编译器不会做这样的事情,比如gcc)

要改也很简单,我们回顾erase这个函数,他删除pos位置的数据,并且会返回删除后位置的值,所以我们的代码改成下面的写法即可

void Test1()
{
	vector v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	vector::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
		{
			it = v.erase(it);   //变化在这里
		}
		else
		{
			++it;
		}
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

3.其他型

在实际运用中我们还会遇到很多其他情况的迭代器失效情况,为了减少这种错误,我们在使用vector时就需要提前考虑会不会出现迭代器失效,并且想好怎么避免,以及如何解决,例子是举不完的,要我们在实际运用中学习才能更好的理解

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!

你可能感兴趣的:(c++,开发语言)