[英]Swapping vs. assigning with std::map [] operator (const issue)
我目前正在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
使用这种“交换”技术的值。
没有简单的方法来实现像C ++那样的地图。 想一想:为了做到这一点,你必须让map []返回一个带有重载赋值运算符的代理对象,然后在底层映射上调用erase和remove,同时还要小心确保它仍然作为一个引用用作右值时的值。 返回参考是唯一明智的做事方式,也更直观。
至于如何做你想做的事情,你应该只写一个函数来做这个,并调用该函数而不是试图直接将元素分配给地图。
我想你将地图定义为:
std::map<Key, Value> mymap;
请注意,地图的内部节点存储了您最初传递的Key和Value的副本。 如果你想使用交换语义,你应该使用指向Value的指针,例如:
std::map<Key, std::shared_ptr<Value> > mymap;
然后更改值将是这样的:
mymap[key].reset(new Value(...));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.