2010-12-06 36 views
7

可能重复:
Checking value exist in a std::map - C++
How to traverse a stl map/vector/list/etc?搜索特定值的std ::地图

你好,

是否有可能要搜索的性病特定值: :地图,不知道密钥?我知道我可以迭代整个地图,并比较值,但是可以使用std算法中的函数吗?

+1

对于`std :: map`,你必须迭代。否则,使用`boost :: bimap` - http://stackoverflow.com/questions/535317/checking-value-exist-in-a-stdmap-c – birryree 2010-12-06 15:25:52

+0

这个链接告诉你如何遍历地图^^^ – 2010-12-06 16:03:57

回答

4

这会有帮助吗? STL find_if

您需要具有某种谓词,或者是函数指针或者实现了operator()的对象。所述谓词应该只有一个参数。

8

如果您想对值和索引建立索引,则可以使用Boost.Bimap。没有这个或类似的,这将不得不通过蛮力(=>手动扫描map)。

Boost.Bimap是一个C++的双向映射图库 。通过Boost.Bimap,您可以在 中创建关联容器,这两种类型都可以用作关键字。

+0

+ 1。另外,如果不允许在代码中使用Boost,则可以使用两个相反的STL映射。 – Stas 2010-12-06 15:47:50

2

使用标准函数(例如,std::find_if)有一些(尴尬的)方法来做到这一点,但是这些方法仍然涉及迭代整个地图。 Boost.Bimap将在两个方向上提供高效的索引,并且您可以使用Boost.Multi-Index更进一步。

12

嗯,你可以使用std::find_if

int main() 
{ 
    typedef std::map<int, std::string> my_map; 

    my_map m; 
    m.insert(std::make_pair(0, "zero")); 
    m.insert(std::make_pair(1, "one")); 
    m.insert(std::make_pair(2, "two")); 

    const std::string s("one"); 
    const my_map::const_iterator it = std::find_if(
     m.begin(), m.end(), boost::bind(&my_map::value_type::second, _1) == s 
    ); 
} 

但是,这仅仅比手工制作的循环稍微好一点:它仍然O(n)