2

在寻找一种仅在密钥不存在时才插入地图的有效方法时,我遇到了 这种方法

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. 与直接插入相比,这种方法有什么好处?IE

    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?还是不适用?

4

1 回答 1

1

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

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

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

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

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

于 2012-11-12T15:58:22.690 回答