find()vs lower_bound + key_comp

时间:2013-11-01 08:40:08

标签: c++

我在stackOverflow中遇到了以下问题 std::map insert or std::map find?

为什么使用find()认为低于lower_bound()+ key_comp()?

假设我有以下地图

map<int, int> myMap;
myMap[1]=1; 
myMap[2]=3;
myMap[3]=5;
int key = xxx; //some value of interest.
int value = yyy; 

建议的答案是使用

map<int, int>::iterator itr = myMap.lower_bound(key);
if (itr != myMap.end() && !(myMap.key_comp()(key, itr->first)))
{
    //key found. 
    // do processing for itr->second
    // 
}else {
    //insert into the end position 
    myMap.insert (itr, map<int, int>::value_type(key, value));
}

为什么它比以下更好?

map<int, int>::iterator itr = myMap.find(key);
if (itr != myMap.end())
{
    //key found. 
    // do processing for itr->second
    // 
}else {
    //insert into the end position 
    myMap.insert (itr, map<int, int>::value_type(key, value));
}

1 个答案:

答案 0 :(得分:10)

在第二种情况下,请注意,如果需要插入值,则迭代器始终为myMap.end()。这无助于提高插入操作的性能(当然,当最后插入新元素时除外)。容器需要找到插入新节点的正确位置,通常为O(log N)。

使用lower_bound(),您已经找到容器的最佳提示,其中插入新元素,这是第一种技术提供的优化机会。这可能会导致性能接近O(1)。你有一个额外的密钥比较,但也是O(1)(从容器的角度来看)。

由于初始find()lower_bound都是O(log N),因此在第一种技术中使用O(log N)加上两次O(1)操作并且使用两个O (记录N)第二种情况下的操作。