C ++ operator []语法

时间:2009-11-01 23:50:32

标签: c++ map operators operator-overloading

只是一个快速的语法问题。我正在写一个地图课(学校)。

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

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

用户写道时会发生什么:

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

执行类似的操作只会覆盖Key k处的[null]指针的临时副本。甚至可以这样做:

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

具有相同的运算符重载?

1 个答案:

答案 0 :(得分:5)

它与std::map一起使用的方式是,如果密钥不存在,map类将插入一个默认值,然后返回一个左值(一个与该键相关的值的可赋值引用),所以可以为它分配一个新值。

因此,在下面的代码示例中,假设map为空,这将在地图中插入10并将其与值3相关联。

map[10] = 3;

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

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

编辑:我现在在你的代码中注意到你正在返回一个指针。如果要对std :: map使用的operator[]使用插入/查找范例,则返回引用更有意义。返回指针可以为您提供以下优势:您可以检查operator[]的返回值是否为NULL以检查密钥是否不存在,但同样,如果您希望operator[]同时提供查找和插入功能,参考将是这里的方式。