在c ++中搜索unordered_map的时间

时间:2014-02-23 23:17:23

标签: c++ stl

我有两个不同的相同功能实现

IPAddress UMNS::lookup(const HostName& name) const{
    auto it=ns.find(name);
    if(it!=ns.end()){
        return (*it).second;
    }
    return NON_EXISTING_ADDRESS;

}

IPAddress UMNS::lookup(const HostName& name) const{

    auto it=find_if(ns.begin(),ns.end(),
        [&name] ( const pair<HostName,IPAddress> &a){ return a.first==name;});
    bool found = it != ns.end();
    if ( found ){
        return (*it).second;
    }
    return NON_EXISTING_ADDRESS;

}

ns是unordered_map但两个函数的执行时间不相同。

首先实现这个:
搜索次数:1000000
平均搜索时间(毫秒):0.000373

第二次实施给出了这个:
搜索次数:1000000
平均搜索时间(毫秒):24.9

第二次实施有什么问题?
为什么我不能使用find_if?

4 个答案:

答案 0 :(得分:6)

find_if对于它搜索的序列是否是容器一无所知,更不用说该容器是否恰好提供了执行相同任务的优化方式。它将迭代它给定的序列,应用它给定的谓词,对于大容器,它将比容器自己的find函数提供的基于散列的查找慢得多。

答案 1 :(得分:3)

std::find_if旨在与任何输入迭代器一起使用,这些输入迭代器可能来自其他容器,例如std::vector。要在像这样的通用容器中查找元素,它需要对所有元素执行线性搜索,直到找到它正在查找的元素。另一方面,find std::unordered_map成员专门为该容器设计,能够以平均恒定时间查找元素。

答案 2 :(得分:2)

find_if必须查看地图中的每个条目,直到找到您要查找的条目,因为它不知道第二个实现与第一个实现等效,因为它不能看看你给它的谓词内部(并且编译器无法对其进行优化)。

答案 3 :(得分:1)

find_if是最不通用的版本,不利用容器内部结构或排序。所以它使用普通的O(n)搜索。使用成员find,您将获得O(1)次搜索,因为unordered_map是作为哈希表实现的。