我有一个对象地图,我想更新映射到一个键的对象,或者创建一个新对象并插入到地图中。更新由一个不同的函数完成,该函数获取指向对象的指针(void update(MyClass * obj))
在地图中“插入或更新”元素的最佳方法是什么?
答案 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()需要一个指针。
我强烈建议不要使用原始指针。