nir*_*iro 3 c++ iterator vector
我有vector(loops)的向量,它包含整数值.一些内部向量是重复的,但它们的元素顺序不一样.现在,我想得到一个矢量矢量,没有任何重复的内部向量.这是我的vec vec的一个例子;
loop =((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++;
}
}
Run Code Online (Sandbox Code Playgroud)
这花了很长时间,我认为我的程序是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);
Run Code Online (Sandbox Code Playgroud)
惯用的方法是使用自定义谓词的擦除/删除习惯用法.要检查重复的向量并且不修改向量的内容,请编写一个谓词,该谓词按值获取其参数,对向量进行排序并使用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() );
Run Code Online (Sandbox Code Playgroud)
至于为什么你当前的代码失败:从一个元素中删除一个元素,vector使当前存在的所有其他迭代器无效,从而vector::erase将有效的迭代器返回到已被删除的元素之后的位置.
stdlib还提供了看起来更适合您的目的的容器set和multiset容器.