STL映射 - 插入或更新

时间:2010-05-07 06:32:28

标签: c++ stl

我有一个对象地图,我想更新映射到一个键的对象,或者创建一个新对象并插入到地图中。更新由一个不同的函数完成,该函数获取指向对象的指针(void update(MyClass * obj))

在地图中“插入或更新”元素的最佳方法是什么?

5 个答案:

答案 0 :(得分:20)

答案 1 :(得分:11)

使用以下代码段:

std::map<Key, Value>::iterator i = amap.find(key);

if (i == amap.end())
    amap.insert(std::make_pair(key, CreateFunction()));
else
    UpdateFunction(&(i->second));

如果要测量可能提高性能的内容,可能需要使用.lower_bound()来查找条目的位置,并在需要插入新对象的情况下将其用作插入的提示。

std::map<Key, Value>::iterator i = amap.lower_bound(key);

if (i == amap.end() || i->first != key)
    amap.insert(i, std::make_pair(key, CreateFunction()));
                                       // Might need to check and decrement i.
                                       // Only guaranteed to be amortized constant
                                       // time if insertion is immediately after
                                       // the hint position.
else
    UpdateFunction(&(i->second));

答案 2 :(得分:1)

类似的东西:

map<int,MyClass*> mymap;
map<int,MyClass*>::iterator it;

MyClass* dummy = new MyClass();
mymap.insert(pair<int,MyClass*>(2,dummy));

it = mymap.find(2);
update(it.second);

这里有一个很好的参考link

答案 3 :(得分:1)

operator[]已经做了,你想要什么。有关详细信息,请参阅the reference

答案 4 :(得分:0)

insert的返回值是“一个由对插入的元素(或阻止插入的元素)的迭代器和表示是否发生插入的布尔组成的对。”

因此,您只需完成

auto result = values.insert({ key, CreateFunction()});
if (!result.second)
    UpdateFunction(&(result.first->second));

注意: 由于您的问题涉及原始指针,并且您说过要让Update函数采用指针,因此我在代码段中做了这个假设。假设CreateFunction()返回一个指针,而UpdateFunction()需要一个指针。

我强烈建议不要使用原始指针。