【问题标题】:Finding value in unordered_map在 unordered_map 中寻找价值
【发布时间】:2010-12-09 05:09:26
【问题描述】:

我正在使用 Boost unordered_map。每个条目都有一个键值对。如何确定地图中是否存在特定值? (我不想创建另一个 unordered_map 将值存储为键和键作为值)

谢谢。

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    以下内容如何:

    typedef std::unordered_map<int,std::string> map_type;
    typedef std::unordered_map<int,std::string>::value_type map_value_type;
    
    map_type m;
    
    if (m.end() != find_if(m.begin(),m.end(),[](const map_value_type& vt)
                                               { return vt.second == "abc"; }
                                               ))
       std::cout << "Value found." << std::end;
    else
       std::cout << "Value NOT found." << std::end;
    

    或者使用捕获的外部变量:

    std::string value = "abc";
    if (m.end() != find_if(m.begin(),m.end(),[&value](const map_value_type& vt)
                                                     { return vt.second == value; }))
       std::cout << "Value found." << std::end;
    else
       std::cout << "Value NOT found." << std::end;
    

    【讨论】:

    • 感谢您的回复。对于 lambda 表达式,如果 return vt.second == "abc" 其中 "abc" 是需要传入的参数,我该如何传入参数?
    • 我已经更新了上面的例子。简而言之,您从定义 lambda 的范围中捕获变量。
    • 不错的答案,不过需要 C++0x(或 C++03 的扩展)。
    【解决方案2】:

    Boost 有Bimap,它是一个双向映射(即键和值都相互引用)。这听起来比unordered_map 更适合您的需求。

    【讨论】:

    • OP不是说他们不想要反向地图吗?虽然他们没有说明原因。
    • 小孩子不想去看牙医,但不管怎样,良好的父母都会这样做。
    • @ephemient:我认为 OP 不想维护单独的数据结构(更有可能)。因此,如果它全部打包,我不明白为什么会有问题(因为无论如何都为value 定义了相等性)。
    【解决方案3】:

    您需要遍历unordered_map 中的所有元素并查看给定值是否存在。

    带有自定义谓词的std::find_if 算法可用于简化此操作。

    【讨论】:

    • 自定义谓词?你需要的一切都已经在 STL 中了。 compose1(bind2nd(equal_to&lt;Value&gt;(), value), select2nd&lt;pair&lt;Key, Value&gt; &gt;())
    • @ephemient:这既不简单也不可读。 (另外,select2nd,虽然是 STL 的一部分,但不是 C++ 标准库的一部分)
    • @ephemient:这是我见过的最糟糕的 STL 用途之一。
    猜你喜欢
    • 2015-06-10
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多