繁体   English   中英

交换与使用std :: map []运算符分配(const问题)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM