2009-11-01 83 views
1

只是一个快速的语法问题。我正在写地图课(学校)。C++运算符[]语法

如果我定义了以下运算符重载:

template<typename Key, typename Val> class Map {... 
Val* operator[](Key k); 

会发生什么事,当一个用户写道:

Map<int,int> myMap; 
map[10] = 3; 

做这样的事情,只有将覆盖[空]指针的临时副本键k。是否有可能这样做:

map[10] = 3; 
printf("%i\n", map[10]); 

具有相同的运算符过载?

回答

5

它与std::map一起工作的方式是,如果该键不存在,映射类将插入一个默认值,然后返回一个左值(一个可分配的与该键关联的值的引用),因此它可以被分配一个新的值。

所以,下面的代码示例中,假设map是空的,这将插入10到地图中,并用3

map[10] = 3; 

的值与您的自定义地图类,operator[]应先检查相关联如果Key k存在,如果不存在,则将新的键/值对(使用typename Val的默认构造函数)插入到映射中。然后,您可以返回对与新密钥关联的值的引用,以便用户可以为其分配值。请注意,这意味着Val必须是Assignable并且具有默认构造函数。

这允许operator[]用于插入和查找。您还应该重载operator[]const版本,这当然只支持查找。

编辑:我现在注意到你的代码中你正在返回一个指针。如果你想使用std :: map使用的插入/查找范例operator[],那么返回一个引用会更有意义。返回一个指针给你的好处是你可以检查NULL的返回值operator[]以检查密钥是否不存在,但是,如果你想要operator[]同时提供查找和插入功能,参考将是到这里。

+0

所以我应该定义我的超载为 Val&operator [](Key k);并且确保我适当地进行初始化,即使这里没有任何东西。 – mamidon 2009-11-02 00:04:17

+0

这是正确的。 – 2009-11-02 00:06:24

+0

谢谢一堆;即使不是'需要',我也必须制造物体。 – mamidon 2009-11-02 00:09:38