如何优化unordered_map查找?

时间:2014-10-13 14:39:01

标签: c++ unordered-map

似乎我的程序性能受到以下功能的瓶颈:

inline bool isKeyInMap(const std::string key, std::unordered_map<std::string, MyClass>map)
{
    auto t = map.find(key);
    if (t == map.end()) return false;
    return true;
}

有没有办法加快速度?

编辑:代码是更大功能的一部分。传递价值不是故意的 - 我写了上面的一个删除任何与瓶颈无关的代码。我试图看看是否有更快的方法来执行以下操作:

auto t = map.find(key);
if (t == map.end()) return false;
return true;

如果我和其他人一样好的C ++程序员,我不会在这里发帖。 XD

4 个答案:

答案 0 :(得分:6)

通过引用传递参数,而不是通过值:

bool isKeyInMap(const std::string & key,
                const std::unordered_map<std::string, MyClass> & m)
{
    return m.find(key) != m.end();
}

否则,每次进行查询时,您都会复制所有内容

答案 1 :(得分:3)

这里有两个与表现有关的主要内容。

1)您要求在unordered_map中优化搜索操作。

无序映射实现为某种哈希表。因此,在大多数情况下,查找它是O(1)。这是最低成本,因此无法进一步优化。

2)您正在按值传递map,这会导致将所有地图元素复制到其他值。

这里只能进行优化是通过const引用传递地图,以避免复制以及更改地图内容。

答案 2 :(得分:0)

您按值传递了密钥和地图,这两个副本都非常昂贵。只需将签名更改为:

inline bool isKeyInMap(const std::string& key, 
    const std::unordered_map<std::String, MyClass>& map);

应该快得多。

答案 3 :(得分:0)

每次pass by value时,您最终都会将所有内容复制到临时变量中。 Pass by reference必须做到这一点:

inline bool isKeyInMap(const std::string& key, std::unordered_map<std::string, MyClass>& map) const
{
    auto t = map.find(key);
    if (t == map.end()) return false;
    return true;
}

另外,请注意方法末尾的const!由于您不会在此方法中修改任何成员变量,因此最好将其声明为const