读书人

关于迭代器“去重”的有关问题(求解篇)

发布时间: 2012-04-12 15:46:35 作者: rapoo

关于迭代器“去重”的问题(求解篇)

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);
[解决办法]
指向被删除元素后面元素的迭代器
探讨

解决了!
谢谢!

再问一下:

这样子的话:C/C++ code
xx = x.erase(xxx);


它传递给xx的是什么?

[解决办法]
探讨

解决了!
谢谢!

再问一下:

这样子的话:C/C++ code
xx = x.erase(xxx);


它传递给xx的是什么?

[解决办法]
这个意义只是相对于内存的循环而言的。而且你这里还是有隐患的。隐患就是外层的迭代器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);} 

读书人网 >C++

热点推荐