关于迭代器“去重”的问题(求解篇)
- C/C++ code
#include<iostream>#include<vector>using namespace std;int main(){ int s[]={1,2,4,5,6,7,8,2,4,5,10,18}; vector<int> T(s,s+12); for(vector<int>::iterator i=T.begin();i!=T.end();++i) { for(vector<int>::iterator j=i;j!=T.end();++j) if(*i==*(j+1)) { T.erase(j+1); } } for(vector<int>::iterator k=T.begin();k!=T.end();++k) cout<<*k<<" ";}想用迭代器去除顺序链表中的重复元素。求解!
[解决办法]
erase后,迭代器无效
请重新从返回值得到
详情看文档
xx = x.erase(xxx);
[解决办法]
指向被删除元素后面元素的迭代器
[解决办法]
[解决办法]
这个意义只是相对于内存的循环而言的。而且你这里还是有隐患的。隐患就是外层的迭代器i也面临失效
[解决办法]
- C/C++ code
#include "stdafx.h"#include<iostream>#include<vector>using namespace std;int main(){ int s[]={1,2,4,5,6,7,8,2,4,5,10,18}; vector<int> T(s,s+12); for(vector<int>::iterator i=T.begin();i!=T.end();++i) { for(vector<int>::iterator j=i+1;j!=T.end();++j)//j=i+1是在刚进入for循环的时候,只会赋值一 if(*i==*j) //是为了防止像你那样写出现j等于end前一个迭 { //代器,进入循环后对指向end的迭代器解引 j = T.erase(j); //用([color=#FF0000]就是这里*(j+1[/color])) } } for(vector<int>::iterator k=T.begin();k!=T.end();++k) cout<<*k<<" ";}
[解决办法]
- C/C++ code
template<class TYPE>void DeleteRepeat(std::vector<TYPE>& vec){ std::vector<TYPE> vecRet; std::set<TYPE> setTemp; for (std::vector<TYPE>::iterator iter = vec.begin();iter != vec.end();++iter) { if (setTemp.find(*iter) == setTemp.end()) { vecRet.push_back(*iter); setTemp.insert(*iter); } } vec.swap(vecRet);}