删除一个向量中的重复向量

3
我有一个向量的向量(loops),其中包含整数值。一些内部向量是重复的,但它们的元素顺序不同。 现在,我想得到一个没有任何重复内部向量的向量的向量。 这是我的向量示例; 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)和(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++;
       }

  }

花费了很长时间,我以为我的程序崩溃了。请帮助我纠正这个问题。

此外,我尝试了这个。它可以工作,但是我得到了错误的答案。请帮忙。

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); 

“crashed” 怎么了?未捕获的异常?段错误,也许? - user142019
3
为什么不制作一个集合或多重集的向量呢?这样识别重复项就容易得多了。甚至可以用一个集合的集合。 - Kerrek SB
@KerrekSB 这两个集合 (1,1,2) 和 (1,2,2) 相等吗? - Luchian Grigore
1个回答

6
惯用的方法是使用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还提供了set和multiset容器,看起来更适合您的目的。

谢谢回复。但是我正在使用DevC++,无法使用惯用方式(我之前尝试过使用这种方式来删除向量中的元素,但无法实现。所以我希望Dev不能识别这些惯用语),如果您可以,请添加传统的方法来完成相同的事情。然后,我可以学习和实施。另外,我无法使用set作为我的真正对象类不是整数(它是我的自定义类PointNumber,但继承自整数并作为整数发布,以简化问题)。-提前致谢- - niro
1
@g_niro 我没有使用过DevC++,但这似乎是不可能的。你是否包含了正确的头文件?你至少需要包含algorithmvector才能使上述代码工作。如果algorithm头文件不支持removesort,那么你应该尽快切换到可行的平台。 - pmr
@g_niro 另外,只要 PointNumber 定义了 operator<,那么 intPointNumber 之间的差异对代码没有任何影响。 - pmr
@g_niro,所以我不明白是什么原因导致这个解决方案对你无效。你可能需要在另一个问题中展示代码和错误信息。 - pmr
抱歉,我不能改变我的元素顺序,因为我需要这些有序的值后面使用。(我猜没有办法使用排序)。 - niro
@pmr 我认为 equal_vector 应该是 UnaryPredicate,正如 remove_if 的文档所述。你是如何处理比较元素的? - samu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接