C++ 语言 迭代器失效

一:迭代器简介

iterator,
迭代器是一种遍历容器内元素的数据类型,这种数据类型感觉有点像指针,我们理解的时候就理解为迭代器用来指向容器中的某个元素。

string, vector [],很少用[],更常用的访问方式就是用迭代器(更通用)。
通过迭代器,我们就可以读容器中的元素值,读string中的每个字符,还可以修改某个迭代器所指向的元素值。

类似于++,--等操作
list, map ,尽量学会用迭代器来访问容器中的元素。


二:const迭代器

const_iterator 表示该迭代器指向的元素的值不能改变,该迭代器可以改变,该迭代器可以不断地指向容器中的下一个元素。就类似const char *.

int main()
{
	
	vector<int> vint = { 100,200,300 };
	vector<int>::const_iterator iter;//定义一个const_iterator
	for (iter = vint.begin(); iter != vint.end(); ++iter)
	{
		*iter = 10;//不可以
		cout << *iter << endl;//可以
	} 

return 0;

}

cbegin() 与cend():

vector的成员函数,不管该容器是否是常量容器,这两个函数返回的都是常量迭代器。


三、迭代器失效

迭代器失效的演示程序1:

int main()
{
	vector<int> vecvalue{ 1,2,3,4,5 };

	auto beg = vecvalue.begin();
	auto end = vecvalue.end();

	while (beg != end)
	{
		vecvalue.insert(beg, 10);//在beg这个位置插入元素 10
		//break;
		++beg;
	}//这段代码会导致程序崩溃,因为在容器中删除/插入新的元素后,迭代器就已经失效了,
	 //容器实际的begin和end位置就该变了。但是while循环的判断条件没有变,所以在插入一个元素后break
	return 0;
}

正确的往容器中使用迭代器Insert数据,演示程序:

int main()
{
	vector<int> vecvalue{ 1,2,3,4,5 };
	int count = 0;
	auto beg = vecvalue.begin();

	while (beg != vecvalue.end())
	{
		beg = vecvalue.insert(beg, 10 + count);//insert返回的结果保存给beg
		count++;
		if (count > 10)
		{
			break;//插入10个结束循环
		}
		++beg;
	}
	for (beg = vecvalue.begin(); beg != vecvalue.end(); beg++)
	{
		cout << *beg << endl;
	}
	
	return 0;
}

C++ 语言 迭代器失效


迭代器失效的演示程序2:

int main()
{
	vector<int> iv{ 100,200,300 };
	//.......
	//在程序执行到最后,要退出时
	for (auto iter = iv.begin(); iter != iv.end(); iter++)
	{
		iv.erase(iter);//erase函数,一处iter位置上的元素,返回下一个位置
	}
	
	return 0;
}

在程序运行后崩溃,因为迭代器失效了。这里要保存erase函数返回的位置。所以可以这样写:

int main()
{
	vector<int> iv{ 100,200,300 };
	//.......
	//在程序执行到最后,要退出时
	vector<int>::iterator iter = iv.begin();
	while (iter != iv.end())
	{
		iter = iv.erase(iter);
	}
	for (auto beg = iv.begin(); beg != iv.end(); beg++)
	{
		cout << *beg << endl;
	}
	return 0;
}

上一篇:async/await与promise(nodejs中的异步操作问题)


下一篇:c++尾置返回类型和引用去除