在插入之前使用lower_bound搜索地图的好处。相当于ptr_map?

时间:2012-11-12 15:50:59

标签: c++ optimization map boost-ptr-container

虽然只有在密钥不存在的情况下寻找插入地图的有效方法,但我遇到了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(),即接受迭代器位置的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 }

所以我想知道:

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

    lower_bound
  2. 如果确实有充分的理由使用boost::ptr_map方法,是否有{{1}}的等效策略?或者它不适用?

1 个答案:

答案 0 :(得分:1)

有两种最有效的方法可以做到这一点。

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

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

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

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