从嵌套循环中的 std::list 中删除将返回访问冲突



我有一个很大的元素列表,可能有重复项。我想删除这些重复项,但我的程序在删除大约 700 个项目后导致访问冲突错误。

这是我的代码:

for (auto it : endlist){        
bool first = true;
for (auto it2 : endlist){   
if (!first){
if (similar(it, it2)){
endlist.remove(it2);
continue;
}
rotate( it);
if (similar(it, it2)){
endlist.remove(it2);
continue;
}
rotate(it);
if (similar(it, it2)){
endlist.remove(it2);
continue;
}
rotate(it);
if (similar(it, it2)){
endlist.remove(it2);
continue;
}
}
first = false;
}
}

访问冲突在第二个 for 循环中引发。有人可以解释为什么会发生这种情况吗?

你为什么不使用

std::list::sort()

然后

std::list::unique() 

相反?它将删除排序列表中的所有重复项。

你要求什么:

for (size_t i=0; i!=endlist.size(); ++i)
{
for (size_t j=i+1; j!=endlist.size(); ++j)// only compare matrices once by using j=i+1
{
if (sometest(endlist[i],endlist[j]))
{
endlist.erase(endlist.begin()+j);  //  Also resizes the vector.
}
}
}

你没有问的:

如果您能够根据旋转更改矢量和元素,则可以通过排序更清洁地完成此操作。

为此,您必须为矩阵定义一个operator<(...),这应该可以通过比较它们的大小然后按字典顺序进行比较来实现。然后,您需要在结束列表中存储旋转方面的最小矩阵,以便有意义。完成后,您可以使用其他答案方法进行过滤。

而且,如果您无论如何都不想对重复项执行任何操作,我建议您使用一个从一开始就不允许重复项的容器,例如std::map

最新更新