如何从两个字符串列表中删除常用值

时间:2016-03-19 18:10:19

标签: c++ list iterator

我是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++;
        }
    }
}

3 个答案:

答案 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并获取结果。尽管如此,您将需要更改您的外部循环。