其他分享
首页 > 其他分享> > c – 避免在map / unordered_map中进行多次查找

c – 避免在map / unordered_map中进行多次查找

作者:互联网

假设我们有一个昂贵的函数将字符串映射到int并希望将结果缓存在映射中.

最简单的代码就是

int mapStringToIntWithCache(std::string const& s) {
    static std::unordered_map<std::string, int> cache;
    if (cache.count(s) > 0) return cache[s];
    else return cache[s] = myExpensiveFunction(s);
}

但这有2次查找.

因此,我倾向于写这个

int mapStringToIntWithCache(std::string const& s) {
    static std::unordered_map<std::string, int> cache;
    size_t sizeBefore = cache.size();
    int& val = cache[s];
    if (cache.size() > sizeBefore) val = myExpensiveFunction(s);
    return val;
}

这只有一个查找,但似乎有点笨拙.有没有更好的办法?

解决方法:

只需使用std :: map :: emplace()方法:

int mapStringToIntWithCache(std::string const& s) {
    static std::unordered_map<std::string, int> cache;
    auto pair = cache.emplace( s, 0 );
    if( pair.second )
         pair.first->second = myExpensiveFunction(s);
    return pair.first->second;
}

标签:c,performance,dictionary,stdmap
来源: https://codeday.me/bug/20190724/1521927.html