删除矢量矢量内的重复矢量 [英] Remove duplicate vectors inside a vector of vector
问题描述
我有一个向量( loops
),它包含整数值。一些内部矢量是重复的,但它们的元素顺序是不一样的。现在,我想得到一个矢量的矢量,没有任何重复的内部矢量。
这里是我vec vec的例子;
I have a vector of vector (loops
) which contains integer values. Some inside vectors are duplicating but their element order is not the same. Now, I want to get a vector of vector without having any duplicate inner vectors.
here is an example for my vec of vec;
loops =((9 18 26 11 9),(9 11 26 18 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), (25 16 49 25),(26 11 45 26))
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)
是重复的,那么我可以删除第二个或所有其他重复。
To identify whether any inner vector is a duplicate of another inner vector; I have developed a function IsDuplicate
. This tells me, (9 18 26 11 9) and (9 11 26 18 9)
are duplicates then I can delete the second or all other duplicates.
为了删除我向量中的重复向量,我实现了以下代码。
To remove duplicate vectors inside my vector of vector, I have implemented following codes.
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。所以,请帮我纠正这个问题。
it took very very long time and i thought my program is crasihing. so, Please help me to rectify this issue.
也,我试过这个。这工作,但我有一个错误的答案。任何帮助。
also, i tried with this. this works but i got a wrong answer. any help please.
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);
推荐答案
惯用的方法是使用使用自定义谓词删除/删除成语。
要检查重复的向量,而不修改向量的内容,写一个谓词,它接受其参数的值,排序向量,并使用 std :: equal
。
The idiomatic way is to use the Erase/Remove idiom with a custom predicate.
To check for duplicate vectors and without modifying the contents of your vectors, write a predicate that takes its arguments by value, sort the vectors and use 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 :: erase
返回一个有效的迭代器到已经删除的元素之后的位置。
As to why your current code fails: Erasing an element from a vector
invalidates all other iterators to that vector that are currently in existence thus vector::erase
returns a valid iterator to the position after the element that has been removed.
stdlib还提供 set
和 multiset
容器,看起来更适合您的目的。
The stdlib also provides the set
and multiset
container which look like a much better fit for your purpose.
这篇关于删除矢量矢量内的重复矢量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!