c++ unordered_map,有效的延迟加载和value的使用



我想使用延迟加载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;

最新更新