我目前正在std::map
上使用[]运算符:
map[key] = value;
没什么太疯狂的。但是,我的值包含一个const公共成员:
class Value
{
public:
Value(int input) : member(input) { }
const int member;
};
不了解我的应用程序的细节,const成员是我们想要保留的东西。鉴于此,我假设map[key] = value
正在做的事情就是首先删除现有值,然后插入新值:
map.erase(map.find(key));
map.insert(make_pair(key, value));
然而,实际上似乎正在发生的是operator []
返回对Value的引用,因此尝试使用=赋值或移动运算符或其他东西。显然,这不起作用,因为该成员无法重新分配。现在,我只需要调用erase然后插入自己,但我想知道是否有办法拉出使用这种“交换”技术的map[key] = value
。
答案 0 :(得分:2)
在C ++中实现类似的地图并不容易。想一想:为了做到这一点,你必须让map []返回一个带有重载赋值运算符的代理对象,然后在底层映射上调用erase和remove,同时还要小心确保它仍然作为一个引用用作右值时的值。返回参考是唯一明智的做事方式,也更直观。
至于如何做你想做的事情,你应该只写一个函数来做这个,并调用该函数而不是试图直接将元素分配给地图。
答案 1 :(得分:1)
我认为您将地图定义为:
std::map<Key, Value> mymap;
请注意,地图的内部节点存储了您最初传递的密钥和值的副本。如果你想使用交换语义,你应该使用指向Value的指针,例如:
std::map<Key, std::shared_ptr<Value> > mymap;
然后更改值将类似于:
mymap[key].reset(new Value(...));