C++unordered_map,高效的延迟加载和值的使用
C++ unordered_map, efficient lazy load and use of value
我想使用 unordered_map 的延迟加载。我在地图上搜索钥匙。如果存在,我使用该值。如果它不存在,我创建值并放置键值对。
我想避免最后的 map.find() 语句 - 它应该是一个不必要的操作(性能很重要)。它可能会失败 :-( 我希望有更好的解决方案。
注意:调用例程应该只有对值的 const 引用。避免在调用例程中实例化值。
我怎样才能避免第二次查找并将范围适当的 const 引用返回给调用者?
h 文件
` typedef std::vector DataPtrListVector;
struct DataCacheStruct
{
DataPtrListVector dataItemOne;
};
typedef boost::unordered_map DataCacheMap;
// declare instance variable
DataCacheMap dataCacheMap;
// declare function
const DataCacheStruct& getOrCreateData( const std::string& dataKey,... );`
cpp 文件
` // Lazy Load of DataStruct unordered_map
std::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())
{
return itData->second;
}
DataCacheStruct newData = doSomethingSlow();
dataCacheMap.emplace(std::make_pair(key, newData));
// Now I want to return newData as a const reference, as per unordered_map
// but it goes out of scope before the calling routine can use it.
DataCacheMap::const_iterator itData = dataCacheMap.find(key);
return itData->second;
}`
正如我已经说过的,方法 emplace
、returns 一对指向新插入元素的迭代器和一个值为 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;
我想使用 unordered_map 的延迟加载。我在地图上搜索钥匙。如果存在,我使用该值。如果它不存在,我创建值并放置键值对。
我想避免最后的 map.find() 语句 - 它应该是一个不必要的操作(性能很重要)。它可能会失败 :-( 我希望有更好的解决方案。
注意:调用例程应该只有对值的 const 引用。避免在调用例程中实例化值。
我怎样才能避免第二次查找并将范围适当的 const 引用返回给调用者?
h 文件
` typedef std::vector DataPtrListVector; struct DataCacheStruct { DataPtrListVector dataItemOne; }; typedef boost::unordered_map DataCacheMap; // declare instance variable DataCacheMap dataCacheMap; // declare function const DataCacheStruct& getOrCreateData( const std::string& dataKey,... );`
cpp 文件
` // Lazy Load of DataStruct unordered_map std::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()) { return itData->second; } DataCacheStruct newData = doSomethingSlow(); dataCacheMap.emplace(std::make_pair(key, newData)); // Now I want to return newData as a const reference, as per unordered_map // but it goes out of scope before the calling routine can use it. DataCacheMap::const_iterator itData = dataCacheMap.find(key); return itData->second; }`
正如我已经说过的,方法 emplace
、returns 一对指向新插入元素的迭代器和一个值为 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;