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