我是C ++的新手,经过谷歌搜索后我还没有找到解决方案。 我正在制作一个Hexgame,我试图检查是否有胜利者。 我的函数checkpath,获取它访问过的地点列表(usedPlaces),并创建列表可能,它可以从当前位置检查下一个地方。 所以我想从可能中删除我已访问过的地方。 我遇到的错误是"列表迭代器不兼容" 我尝试了一些事情,但他们最终给了我其他错误
for (list<string>::iterator it = possible.begin(); it != possible.end(); it++)
{
for (list<string>::iterator it2 = usedPlaces.begin(); it2 != usedPlaces.end();)
{
if (it == it2)
{
possible.remove(*it);
}
else
{
it2++;
}
}
}
答案 0 :(得分:2)
执行此操作时:
if (it == it2)
您将迭代器与一个列表进行比较,将迭代器与另一个列表进行比较。无论如何,那些永远不会比较平等,你的实现为你调试这个很方便。即使你修正了比较(到*it == *it2
),由于it
如何以及何时增加和低效(由于额外搜索possible
),代码仍然会出错。功能版本将是:
for (list<string>::iterator it = possible.begin(); it != possible.end(); /* nothing */)
{
list<string>::iterator it2 = std::find(usedPlaces.begin(), usedPlaces.end(), *it);
if (it2 != usedPlaces.end()) {
it = possible.erase(it);
}
else {
++it;
}
}
但这很容易编写并且容易出错。我更喜欢使用list::remove_if
,它接受一个谓词并删除该谓词返回true的所有元素:
possible.remove_if([&](const std::string& place){
return std::find(usedPlaces.begin(), usedPlaces.end(), place)
!= usedPlaces.end();
});
这更直接。
答案 1 :(得分:1)
目标是删除相同的字符串对象,因此比较应该查看字符串对象。而不是
if (*it == *it2)
应该是
"workItems":[
{"id":7331,
"url":"https://<hostname>/tfs/<collection>/_apis/wit/workItems/7331"}, ... etc.
答案 2 :(得分:1)
操作it == it2
检查一个迭代器是否指向与另一个迭代器相同的元素。从来没有这样,因为这两个迭代器来自两个不同的列表。
您可能想要比较的是每个列表元素的内容,即*it
。
请注意,您的代码中可能存在其他问题。例如。在调用possible.remove(*it)
之后,您的迭代器it
不再引用列表中的任何元素,因此您无法在循环的下一次迭代中递增它。
考虑使用possible.erase
并获取结果。尽管如此,您将需要更改您的外部循环。