std::find (unordered_)map

Posted

技术标签:

【中文标题】std::find (unordered_)map【英文标题】:std::find on an (unordered_)map 【发布时间】:2018-04-09 13:13:19 【问题描述】:

对于 unordered_map,我想做一个反向查找(意思是找到给定值的键)。人们会期望使用 std::find 这很简单。我尝试了以下方法,但不起作用:

#include <unordered_map>
#include <algorithm>

int main()

    std::unordered_map<int, int>    map;

    auto iter = std::find(map.begin(), map.end(), [](const std::pair<int, int> &pair) -> bool 
        return pair.second == 4;
    ); 

编译器抱怨一个无效的二进制表达式,显然它试图将值与谓词本身进行比较:

/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/predefined_ops.h :194:17: 错误:二进制表达式的操作数无效 ('std::pair' 和 'const (lambda at unordered_map.cpp:8:51)') 返回 *__it == _M_value;

我在这里缺少什么?据我所知,这应该是搜索地图的有效谓词。

【问题讨论】:

你的意思是find_if std::findstd::unordered_map 一起使用几乎肯定是一个错误。使用std::unordered_map::find 顺便说一句,撇开问题不谈,您应该知道您正在检查地图中配对的副本。 @PasserBy 虽然我同意该评论的第一部分,但成员 find 在这里没有用处,因为我们没有根据密钥执行查找。 @PasserBy 这与 OP 想要的相反。他们在寻找价值,而不是钥匙 【参考方案1】:

std::find 函数用于在容器中查找。如果您有要使用的谓词,请使用std::find_if

参见例如this std::find and std::find_if reference.

【讨论】:

以上是关于std::find (unordered_)map的主要内容,如果未能解决你的问题,请参考以下文章

std::unordered_map<int32_t, int32_t> 在堆上声明

unordered_map的哈希HASH重载——举例unordered_map与pair联合使用

unordered_map _begin 访问权限错误

包含头文件unordered_map时出错

将对象分配到 unordered_map 数组中?

当我添加一个新元素时,Unordered_map 的行为很奇怪