c++ - 在插入之前使用 lower_bound 搜索 map 的好处。等同于 ptr_map?

标签 c++ optimization dictionary boost-ptr-container

在寻找仅当键不存在时才插入 map 的有效方法时,我遇到了 this approach :

MapType::iterator lb = mymap.lower_bound(k);

if(lb != mymap.end() && !(mymap.key_comp()(k, lb->first))) {
    // key exists. Value accessible from lb->second
} else {
    // Do insert. Use lb as a hint to insert so it can avoid another lookup
    mymap.insert(lb, MapType::value_type(k, v));
}

这适用于 std::map。但是,boost::ptr_map 不提供类似形式的 insert(),即接受迭代器位置的形式。

所以我想知道:

  1. 与直接插入相比,这种方法有什么好处?即

    std::pair<MapType::iterator, bool> ret;
    ret = mymap.insert(MapType::value_type(k, v));
    if (!ret.second) {
        // key exists. insertion not done. do something else
    }
    
  2. 如果确实有充分的理由使用 lower_bound 方法,那么 boost::ptr_map 是否有等效策略?还是不适用?

最佳答案

有两种最有效的方法。

第一个有效的方法就是调用 insert (STL 中也是如此)。这将返回 pair<iterator,bool>因此,如果它已经存在,则不会插入。

第二种方法是使用 operator[],如果键不存在则必须创建对象。这会返回对那里内容的引用。如果该项目不存在,它会使用默认创建的值为您插入。

注意这里的区别:对于指向指针的常规 STL 映射,operator[]将返回一个指针,并将插入一个空指针。对于 boost::ptr_map它不会插入一个空指针,它会插入一个指向默认构造对象的指针。

如果您的集合实际上可能包含默认构造的对象,而您还没有要插入的对象,我找不到一种有效的方法来一次完成。也许在这种情况下不要使用这个集合,或者确保你的对象被稍微修改,这样你就有某种标志来表明它是“默认构造的”,即一种空状态。

关于c++ - 在插入之前使用 lower_bound 搜索 map 的好处。等同于 ptr_map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346892/

相关文章:

swift - 存储 [Int :String] dictionaries to user. 默认值因 SIGABRT 错误而崩溃

c++ - 使用 shared_ptr 从函数返回时进行类型转换

php - 以下查询是否需要 1 分钟或更长时间才能完成?

ios - 从电子表格或数据库文件中的大型数据集创建字典

algorithm - 如何优化解决方案以获得线性性能以找到直方图的孔总面积?

Java 最佳实践静态最终映射值

python - 使用python分割json中的字符串

c++ - 使用 stringstream 将 int 解析为字符串

c++ - 从opencv中的复特征值计算特征向量

c++ - 如何从 C++ 显示 C# 中结构的值