C++ vector容器中用erase函数和迭代器删除重复元素问题分析

Posted 唐火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ vector容器中用erase函数和迭代器删除重复元素问题分析相关的知识,希望对你有一定的参考价值。

第一种写法:

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

int main()

	vector<int>v;
	v.push_back(888);
	v.push_back(89);
	v.push_back(89);
	v.push_back(89);
	v.push_back(9999);
	v.push_back(89);

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
	
		if (*it != 9999)
		
			v.erase(it);
		
	

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
	
		cout << *it << endl;
	

	return 0;

该写法存在很大问题,erase函数返回的结果是指向被删除元素的下一个元素的迭代器,在这里:

v.erase(it);

并没有拿我们的迭代器it去接收这个返回值,故执行第一次erase函数,将888删除后,迭代器it的位置就不知道去哪里了,就会报以下错误!


正确写法应该是:

it = v.erase(it);

第二种写法

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

int main()

	vector<int>v;
	v.push_back(888);
	v.push_back(89);
	v.push_back(89);
	v.push_back(89);
	v.push_back(9999);
	v.push_back(89);

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
	
		if (*it != 9999)
		
			it = v.erase(it);
			it--;
		
	

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
	
		cout << *it << endl;
	

	return 0;

直接报以下错误:

一般人认为因为erase函数返回的结果是指向被删除元素的下一个元素的迭代器,所以用了一个:

it--;

让迭代器it回到原来的位置,但是事实并没有想象中的那么简单!

因为我们不能自以为是的认为vector里的元素就是像数组那样存放,所以你觉得迭代器指向下一个位置后,可以通过it–来回到原来的位置,事实上,它回不去原来的位置,不能直接把迭代器理解成指针,所以不要使用it–。

第三种写法(正确写法)

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

int main()

	vector<int>v;
	v.push_back(888);
	v.push_back(89);
	v.push_back(89);
	v.push_back(89);
	v.push_back(9999);
	v.push_back(89);

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); )
	
		if (*it != 9999)
		
			it = v.erase(it);
		
		else
		
			it++;
		
	

	for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
	
		cout << *it << endl;
	

	return 0;


观察上面两种图,可以看到我已经删除了几个元素89了,但迭代器的地址竟然都没有发生变化,可以看到vector内部是有优化的,所以不能直观的把vector理解为数组,迭代器理解成指针,所以不要使用it–这样的操作。

以上是关于C++ vector容器中用erase函数和迭代器删除重复元素问题分析的主要内容,如果未能解决你的问题,请参考以下文章

C++之迭代器失效总结

vector::erase

c++ STL map 中erase()后++会指向那个元素?以及erase后map将会自动做啥操作(也就是会怎么变动)?

vector的模拟实现(C++)

C++从入门到入土第二十篇:关联式容器-map和set

C++从入门到入土第二十篇:关联式容器-map和set