我的地图如下:
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函数,这些函数已按预期编译和工作。为什么会这样?
答案 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_type
为std::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; });