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

时间:2012-08-03 03:24:01

标签: c++ dictionary std stdmap c++-standard-library

我目前正在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

2 个答案:

答案 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(...));