在寻找一种有效的方法插入到地图只有在键不存在,我碰到this approach:在插入之前使用lower_bound搜索地图的好处。等同于ptr_map?
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 }
如果确实有一个很好的理由来使用
lower_bound
方法,是那里boost::ptr_map
等效的策略?或者它不适用?
有趣的是,它显示我最初在提问前4分钟回答了这个问题。 – CashCow
非常感谢。你的第一个建议确实是我在使用这个例子中引用的方法之前所使用的。在我试图比较这两种方法的时候,它使用'ptr_map'来取消。我原来的问题写得不好,有点误导。现在更新。抱歉。 –
“最高效”这个词是有争议的 - 它取决于一个用例。有可能创建一个插入对象的代价非常高,因此首先需要检查,这是'lower_bound'可以发挥作用的地方。 – 2012-11-12 17:17:00