删除矢量矢量内的重复矢量

时间:2011-10-02 12:24:20

标签: c++ vector iterator

我有一个向量(loops)的向量,它包含整数值。一些内部向量是重复的,但它们的元素顺序不一样。现在,我想得到一个矢量矢量,没有任何重复的内部向量。 这是我的vec vec的一个例子;

loops =((9 18 26 11 9),(9 11 26 18 9),(9 18 25 16 9),(11 45 26 11),(11 26 45 11),(16 49 25 16) ,(16 25 49 16),(18 9 11 26 18),(18 9 16 25 18),(25 16 49 25),(26 11 45 26))

识别内部向量是否与另一个内向量重复;我开发了一个函数IsDuplicate。这告诉我,(9 18 26 11 9) and (9 11 26 18 9)是重复的,然后我可以删除第二个或所有其他重复项。

为了删除矢量矢量中的重复矢量,我实现了以下代码。

Vector<vector<int> > loops;
Vector<vector<int> > ::iterator no1, no2;
Int setno1, setno2;

for (no1=loops.begin(), setno1=0; no1!=loops.end(); no1++, setno1++){
       set1 = *no1;
       for (no2=loops.begin()+setno1, setno2=setno1; no2!=loops.end(); setno2++){
            set2 = *no2;
            if (set2.IsDuplicate(set1))  loops.erase(loops.begin()+setno2);
            else no2++;
       }

  }

花了很长时间,我认为我的程序是crasihing。所以,请帮我纠正这个问题。

另外,我试过这个。这工作但我得到了错误的答案。请帮助。

01   int first=0; bool duplicates=false;  
02   do {     
03        set1 = loops[first];     
04        for (no2=loops.begin()+1, setno2=1;  no2!=loops.end();  setno2++){     
05             set2 = *no2;      
06             if (set2.IsPartOf(set1)){      
07                 loops.erase(loops.begin()+setno2);     
08                 duplicates = true;      
09             }      
10             else no2++;     
11        }      
12        first++;      
13       } while(!duplicates); 

1 个答案:

答案 0 :(得分:5)

惯用法是将Erase/Remove idiom与自定义谓词一起使用。 要检查重复的向量并且不修改向量的内容,请编写一个以值为参数的谓词,对向量进行排序并使用std::equal

bool equal_vector(std::vector<int> a, std::vector<int> b) {
  std::sort(a.begin(), a.end());
  std::sort(b.begin(), b.end());

  return std::equal(a.begin(), a.end(), b.begin());
}

// use it like this
v.erase( remove_if(v.begin(), v.end(), equal_vector), v.end() );

关于你当前代码失败的原因:从vector中删除一个元素会使当前存在的所有其他迭代器无效,因此vector::erase会返回一个有效的迭代器到该元素之后的位置已被删除。

stdlib还提供setmultiset容器,看起来更适合您的目的。