我想使用延迟加载unordered_map。我在地图上找钥匙。如果存在,则使用该值。如果它不存在,则创建值并放置键值对。
我想避免最后一个map.find()语句-它应该是一个不必要的操作(性能很重要)。它可能会失败:-(我希望有一个更好的解决方案。
注意:调用例程应该只有一个对value的const引用。避免在调用例程时实例化value。
我怎样才能避免第二次查找,并有一个适当范围的const引用返回给调用者?
h文件<>之前类型定义std::vector DataPtrListVectorstruct DataCacheStruct{DataPtrListVector dataItemOne;};typedef boost::unordered_map DataCacheMap//声明实例变量DataCacheMap DataCacheMap;//声明函数const std::string& dataKey,…,"之前 cpp文件<>之前’//延迟加载数据结构unordered_mapstd::string key = someString;const DataCacheStruct& dataStruct = getOrCreateData(key,…);//const DataCacheStruct& class::getOrCreateData(const std::string key,…){DataCacheMap::const_iterator itData = DataCacheMap .find(key);if (itData != dataCacheMap.end()){返回itData ->第二;}DataCacheStruct newData = doSomethingSlow();dataCacheMap。安置(std:: make_pair(关键,newData));//现在我想返回newData作为一个const引用,按照unordered_map//但是在调用它的例程可以使用它之前,它已经超出了作用域。DataCacheMap::const_iterator itData = DataCacheMap .find(key);返回itData ->第二;} '正如我已经说过的,方法emplace
返回一对指向新插入元素的迭代器和一个值true。
您可以简单地使用该迭代器来获取引用:
auto it_new_insertion = dataCacheMap.emplace(std::make_pair(key, newData));
if (it_new_insertion.second == false) {
// something wrong with memory. handle it
}
return it_new_insertion.first->second;