C++ 删除向量的向量中的重复向量

C++ 删除向量的向量中的重复向量,c++,vector,iterator,C++,Vector,Iterator,我有一个向量(循环)包含整数值。一些内部向量是重复的,但它们的元素顺序不同。现在,我想得到一个向量的向量,没有任何重复的内向量。 这里是我的vec的一个例子 循环=((91826119),(91126189),(9182516169),(11452611),(11264511),(16492516),(16254916),(189112618),(189162518),(25164925),(26114526)) 确定任何内向量是否与另一个内向量重复;我已经开发了一个函数IsDuplicate。

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

循环=((91826119),(91126189),(9182516169),(11452611),(11264511),(16492516),(16254916),(189112618),(189162518),(25164925),(26114526))

确定任何内向量是否与另一个内向量重复;我已经开发了一个函数
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++;
       }

  }

惯用的方法是与自定义谓词一起使用。 要检查重复的向量,并且不修改向量的内容,请编写一个谓词,按值获取其参数,对向量进行排序,然后使用
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() );
bool相等向量(std::向量a,std::向量b){
排序(a.begin(),a.end());
排序(b.begin(),b.end());
返回std::equal(a.begin(),a.end(),b.begin());
}
//像这样使用它
v、 擦除(如果(v.begin(),v.end(),equal_vector),v.end(),则删除);
至于当前代码失败的原因:从
向量
中删除一个元素会使当前存在的该向量的所有其他迭代器无效,因此
vector::erase
会将有效迭代器返回到删除元素后的位置


stdlib还提供了
set
multiset
容器,看起来更适合您的用途。

如何“崩溃”呢?未捕获异常?分割错误,也许?为什么不做一个集合或多集合的向量?这样识别重复的就容易多了。甚至是一组集合。@KerrekSB集合(1,1,2)和(1,2,2)相等吗?谢谢你的回答。但是我,我使用的是DevC++而我不能使用惯用方式(我之前尝试过用这种方式来删除向量中的元素,但可以做到。所以我希望dev不能识别这些惯用方式。),如果可以,请添加传统方式来做同样的事情。然后,我可以学习和实施。此外,我不能使用set,因为我真正的objct类不是integer(它是我自己的类PointNumber),而是从integer继承而来的,为了简单起见,将其作为integer发布。-提前感谢-@g_niro我没有使用DevC++的经验,但这似乎是不可能的。是否包含正确的标题?您至少需要
算法
向量
才能使上述功能正常工作。如果
算法
标题不支持
删除
排序
,则应尽快切换到可行的平台。@g_niro只要
点编号
具有
operator@g_niro所以我不明白是什么阻止了这个解决方案为您工作。您可能希望在单独的问题中向我们展示代码和错误。对不起,我可以说您,我不能更改元素顺序,因为我以后需要这个orderd值。(我想,没有办法使用sort)。
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() );