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++ STL map 中erase()后++会指向那个元素?以及erase后map将会自动做啥操作(也就是会怎么变动)?