std :: find中的Lambda问题

时间:2014-09-16 18:08:08

标签: c++ c++11 lambda find stdmap

我的地图如下:

std::map<int, std::unique_ptr<Person>> ratingMap;

我想创建一个带有字符串参数_name的函数,并迭代遍历地图,直到找到一个具有相同名称的人:

void Person::deleteFromMap(const std::string& _name){
    //Searches the map for a person whose name is the same as the argument _name
    auto found = std::find(ratingMap.begin(), ratingMap.end(),
        [&](const std::unique_ptr<Person>& person) -> bool{return person->getName() == _name; });

然而,这拒绝编译并给出以下错误:

错误1错误C2678:二进制'==':找不到运算符,它接受类型为'std :: pair'的左手操作数(或者没有可接受的转换)

我花了将近两个小时的时间来尝试使其变得有效,因为我在过去编写了类似的lambda函数,这些函数已按预期编译和工作。为什么会这样?

3 个答案:

答案 0 :(得分:8)

应该是

void Person::deleteFromMap(const std::string& _name){
    //Searches the map for a person whose name is the same as the argument _name
    auto found = std::find_if(ratingMap.begin(), ratingMap.end(),
        [&](std::pair<const int, std::unique_ptr<Person>>& p) -> bool{return p.second->getName() == _name; });

map::value_typestd::pair<const int, std::unique_ptr<Person>>

编辑:正如其他人所说,std::find_if是谓词。

答案 1 :(得分:2)

地图的底层迭代器类型不是std::unique_ptr<Person>。但是std::pair<int, std::unique_ptr<Person>>

您需要修改lambda以采取正确的参数

[&](const std::pair<const int, std::unique_ptr<Person>>& pair)

并从比较中提取第二个值

return pair.second->getName() == _name;

您还应该使用std::find_if因为它接受UnaryPredicate而不仅仅是值

答案 2 :(得分:1)

首先,您必须使用std::find_if 而不是 std::find,并修复lambda的参数类型。

auto found = std::find_if(ratingMap.begin(), ratingMap.end(),
//                    ^^^
    [&](const std::pair<const int, std::unique_ptr<Person>>& person) -> bool
       { return person.second->getName() == _name; });