2012-08-03 43 views
1

分配:交换实现与STL的地图[]运算符(const的问题)我目前使用[]操作STL的地图上

map[key] = value; 

没有什么太疯狂了。但是,我的值包含一个const公共成员:

class Value 
{ 
public: 
    Value(int input) : member(input) { } 
    const int member; 
}; 

没有深入我的应用程序的细节,const成员是我们想要保留的东西。鉴于此,我假设“地图[关键] =价值”在做类似的东西首先删除现有的值,然后插入新的一个:

map.erase(map.find(key)); 
map.insert(make_pair(key, value)); 

然而,究竟是什么似乎是发生的是,[ ]运算符返回对Value的引用,从而尝试使用=赋值或移动运算符等。显然,这是行不通的,因为该成员不能被重新分配。现在,我只需调用擦除然后插入自己,但我想知道是否有一种方法可以取消使用此“交换”技术的map [key] =值。

+0

我不明白为什么这止跌没有工作。地图如何定义? – 2012-08-03 03:34:50

+0

为什么不会映射[]返回一个引用?这对我来说似乎更直观。 – Antimony 2012-08-03 03:37:08

+0

我不认为它不应该返回一个引用,我很满意这个实现,我只是问是否有办法做我想问的。让我以更简单的方式提出这个问题:如果我制作一个std :: map 类型的映射,那么[]将无法工作(由于返回引用)。 – 2012-08-03 03:39:15

回答

2

没有简单的方法来实现类似于C++的地图。想一想:为了做到这一点,你必须让map []返回一个带有重载赋值操作符的代理对象,然后在底层映射上调用擦除和删除操作,同时还要小心确保它仍然作为参考作为右值使用时的值。回归参考是做事情的唯一明智的方式,而且更直观。

至于如何做你想做的事情,你应该写一个函数来实现,并调用该函数,而不是试图直接将元素分配给地图。

+0

是的,事后我注意到一个更简单的方法来问这个问题:“我怎么能用std :: map ”来操作operator [],我想答案是“你不行”。我的困惑来自于ObjC世界,其中blah [key] =值被编译器重写为[blah insertObject:atKeyedIndex:](这显然确实允许做这种交换“魔术”)。 – 2012-08-03 03:44:23

1

我想你定义你的地图,就像这样:

std::map<Key, Value> mymap; 

请注意,您最初传递键和值的映射表存储拷贝的内部节点。如果你想使用交换的语义,你应该使用指针,而不是价值,是这样的:

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

,然后更改值将是这样的:

mymap[key].reset(new Value(...));