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;