1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C++ vector容器中用erase函数和迭代器删除重复元素问题分析

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

时间:2023-07-30 14:25:09

相关推荐

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–这样的操作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。