当前位置:  开发笔记 > 编程语言 > 正文

检查值存在于std :: map - C++中

如何解决《检查值存在于std::map-C++中》经验,为你挑选了4个好方法。

我知道find方法在std :: map中找到提供的键,并将迭代器返回给元素.反正有没有找到值并获得元素的迭代器?我需要做的是检查std :: map中是否存在指定的值.我通过循环地图中的所有项目并进行比较来完成此操作.但我想知道有没有更好的办法.

这是我写的

bool ContainsValue(Type_ value)
{
    bool found = false;
    Map_::iterator it = internalMap.begin(); // internalMap is std::map
    while(it != internalMap.end())
    {
        found = (it->second == value);
        if(found)
            break;
        ++it;
    }
    return found;
}

编辑

如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?std :: map中的find()是否进行顺序搜索?

谢谢



1> Mark Ransom..:

您可以使用boost :: multi_index创建双向映射 - 您可以使用该对中的任意一个值作为快速查找的键.



2> CodeBuddy..:

如果您可以访问优秀的boost库,那么您应该使用boost :: multi_index来创建双向映射,正如Mark所说.与std :: map不同,它允许您通过键或值查找.

如果您只有STL,那么下面的代码就可以解决问题(模板化可以使用mapped_type支持operator ==的任何类型的map):

#include 
#include 
#include 
#include 
#include 

template
struct map_data_compare : public std::binary_function
{
public:
    bool operator() (typename T::value_type &pair, 
                     typename T::mapped_type i) const
    {
        return pair.second == i;
    }
};


int main()
{
    typedef std::map mapType;

    mapType map;

    map["a"] = 1;
    map["b"] = 2;
    map["c"] = 3;
    map["d"] = 4;
    map["e"] = 5;

    const int value = 3;

    std::map::iterator it = std::find_if( map.begin(), map.end(), std::bind2nd(map_data_compare(), value) );

    if ( it != map.end() )
    {
        assert( value == it->second);
        std::cout << "Found index:" << it->first << " for value:" << it->second << std::endl;
    }
    else
    {
        std::cout << "Did not find index for value:" << value << std::endl;
    }
}



3> ChrisW..:

如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?

是:维护两个地图,一个地图使用一种类型的密钥,另一个地图使用另一种.

std :: map中的find()是否进行顺序搜索?

不,它是对已排序树的二进制搜索:其速度为O(log(n)).


如此简单却如此之好(特别是在使用boost库时不是一种选择).有我的upvote.我想补充说,对于反转的地图,使用`std :: multimap`可能比`std :: map`更好,因为原始地图可能有重复的值.那些重复的值然后成为反转映射中的键,因此使用`std :: map`会丢失数据.
插入或删除任何内容需要两倍的时间(使用两张地图而不是一张); 但对于大量元素,查找速度会快得多,因为O(log(n))远小于顺序搜索所需的O(n).

4> Evan Teran..:

查看boost的双向映射:http://www.boost.org/doc/libs/1_38_0/libs/bimap/doc/html/index.html

它让两个值都像一把钥匙.

否则,迭代是要走的路.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有