在unordered_map中寻找价值

12

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

谢谢。

3个回答

14
以下怎么样?
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表达式,如果返回值vt.second == "abc"中的"abc"是需要传入的参数,我该如何传递它? - Ashley
8
我已经更新了上面的例子。简而言之,你需要从定义lambda表达式的作用域中捕获变量。 - Matthieu N.
很好的回答,不过需要C++0x(或C++03的扩展)。 - j_random_hacker

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

OP说他们不想要反向映射,虽然他们没有解释为什么。 - ephemient
3
年幼的孩子们不喜欢去看牙医,但是好的家长仍然会让他们去。 - chrisaycock
1
@ephemient:我认为原帖作者不想维护单独的数据结构(更可能)。因此,如果它是全套的,我看不出为什么会有问题(因为value的相等性已经被定义了)。 - Matthieu M.

5
你需要遍历unordered_map中的所有元素并查看给定值是否存在。
可以使用带有自定义谓词的std::find_if算法来简化此操作。

1
自定义谓词?STL 中已经包含了你所需要的一切。compose1(bind2nd(equal_to<Value>(), value), select2nd<pair<Key, Value> >()) - ephemient
10
那不简单也不易读。(另外,虽然 select2nd 是 STL 的一部分,但它并不是 C++ 标准库的一部分。) - James McNellis
7
那是我见过的 STL 最糟糕的应用之一。 - Matthieu N.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接