1

我目前在 a 上使用 [] 运算符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 []返回对值的引用,因此尝试使用 = 赋值或移动运算符或其他东西。显然,这是行不通的,因为无法重新分配成员。现在,我可以只调用擦除然后插入自己,但我想知道是否有一种方法可以map[key] = value使用这种“交换”技术。

4

2 回答 2

2

在 C++ 中实现这样的映射并不容易。想一想:为了做到这一点,您必须让 map[] 返回一个带有重载赋值运算符的代理对象,然后在底层映射上调用擦除和删除,同时还要小心确保它仍然充当引用用作右值时的值。返回引用是唯一明智的做事方式,也更直观。

至于如何做你想做的事,你可能应该只写一个函数来做到这一点,并调用该函数而不是尝试直接将元素分配给地图。

于 2012-08-03T03:39:24.770 回答
1

我想您将地图定义为:

std::map<Key, Value> mymap;

请注意,地图的内部节点存储您最初传递的 Key 和 Value 的副本。如果你想使用交换语义,你应该使用指向 Value 的指针,比如:

std::map<Key, std::shared_ptr<Value> > mymap;

然后更改值将类似于:

mymap[key].reset(new Value(...));
于 2012-08-03T03:57:50.050 回答