c ++迭代器双循环

时间:2012-07-12 20:43:28

标签: c++ loops stl iterator

我正在尝试做以下事情:

myvec是Couple对象的向量(每个对象都由EntityA和EntityB组成)。 我正试图删除重复的夫妻.. 无论如何,有时下面的代码崩溃与一个超出界限it2。 条件很好,迭代器似乎不是

if(myvec.size()>1)
for(vector<Couple>::iterator it1 = myvec.begin(); it1+1 !=myvec.end();){
    for(vector<Couple>::iterator it2 = it1+1; it2 !=myvec.end();){
        if((it1->EntityA!=it2->EntityA&&it1->EntityA!=it2->EntityB)||
            (it1->EntityB!=it2->EntityA&&it1->EntityB!=it2->EntityB)){
                it2++;
        }
        else{
            myvec.erase(it2);
        }
    }
    it1++;
}

任何解决方案/替代方案?

3 个答案:

答案 0 :(得分:3)

尽可能使用现有的库函数。您需要提供二元谓词函数,或为operator<对象提供operator==Couples

std::sort(myvec.begin(), myvec.end());
myvec.erase(std::unique(myvec.begin(), myvec.end()), myvec.end());

但是,拥有一个可以自动避免重复的容器(如std::set)可能会更好。 This is a related question, with an excellent answer.

答案 1 :(得分:1)

if(myvec.size()>1)
for(vector<Couple>::iterator it1 = myvec.begin(); it1+1 !=myvec.end();){
    for(vector<Couple>::iterator it2 = it1+1; it2 !=myvec.end();){
        if((it1->EntityA!=it2->EntityA&&it1->EntityA!=it2->EntityB)||
            (it1->EntityB!=it2->EntityA&&it1->EntityB!=it2->EntityB)){
                it2++;
        }
        else{
            it2 = myvec.erase(it2);
        }
    }
    it1++;
}
  

返回值指向新位置的随机访问迭代器   函数擦除的最后一个元素后面的元素   call,如果操作擦除了最后一个元素,则为向量结束   顺序。

http://cplusplus.com/reference/stl/vector/erase/

答案 2 :(得分:0)

修改矢量(在组件中移动并在此情况下更改矢量长度)并不是一个好主意。这是你的代码的问题。当您在矢量中间删除一个分量时,末尾的分量会向左移动,因此矢量的末端会移动。这会弄乱你的休息状况。

您可以创建一个新的向量空向量,而不是修改现有向量,并将要保留的每个组件添加到其中。这可能会消耗更多的内存(如果你的矢量很大,可能会引起人们的兴趣),但它应该节省你很多 cpu-time,因为删除矢量中间的一个组件并不便宜操作。它的所有组件都必须一次又一次地移动一个位置(在stl中存在没有这个问题的容器)。因此,构建一个新的向量并添加它应该会更好。