2

remove_if使用on时,我对 lambda 表达式有一个小问题std::vector

我有以下一段代码:

    std::remove_if( openList.begin(), openList.end(), 
        [&](BoardNode& i){
            std::cout<< i.getCoordinates() << std::endl;
            std::cout<< currentNode.getCoordinates() << std::endl;
            return i.getCoordinates() == currentNode.getCoordinates(); }
        );

这没有编译器错误,但从上述语句返回 true 的元素不会从向量中删除;

我被打印在屏幕上,例如

[5,5]
[5,5]

openList仍保持原样。

4

3 回答 3

10

std::remove_if不会从向量中删除任何内容,因为它无权访问它。相反,它将您要保留的元素移动到范围的开头,使剩余的元素处于有效但未指定的状态,并返回新的结尾。

您可以使用“erase-remove”习语从向量中实际擦除它们:

openList.erase(
    std::remove_if( 
        openList.begin(), 
        openList.end(), 
        [&](BoardNode& i){return i.getCoordinates() == currentNode.getCoordinates();}),
    openList.end());
于 2012-11-23T16:49:02.563 回答
3

我认为您打算从向量中删除项目。但是您所做的并不会 真正从向量中删除项目,这使您认为 lambda 不起作用。您需要将erase()成员函数与std::remove.

换句话说,您必须erase-remove idiom用作:

v.erase(std::remove_if(v.begin(), v.end(), your-lambda-goes-here), v.end());
于 2012-11-23T16:48:24.657 回答
0

删除是通过移动范围内的元素以覆盖要擦除的元素来完成的。范围的新旧两端之间的元素具有未指定的值。返回范围新端的迭代器。保留元素的相对顺序。

http://en.cppreference.com/w/cpp/algorithm/remove

另外,请检查该链接上的示例。

于 2012-11-23T16:49:29.213 回答