只是一个快速的语法问题。我正在写一个地图课(学校)。
如果我定义以下运算符重载:
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]);
具有相同的运算符重载?
答案 0 :(得分:5)
它与std::map
一起使用的方式是,如果密钥不存在,map类将插入一个默认值,然后返回一个左值(一个与该键相关的值的可赋值引用),所以可以为它分配一个新值。
因此,在下面的代码示例中,假设map
为空,这将在地图中插入10并将其与值3相关联。
map[10] = 3;
使用自定义地图类时,operator[]
应首先检查Key k是否存在,如果不存在,则在地图中插入新的键/值对(使用typename Val
的默认构造函数) 。然后,您可以返回与新键关联的值的引用,以便用户可以为其分配值。请注意,这意味着Val必须是可分配的并且具有默认构造函数。
这允许operator[]
用于插入和查找。您还应该重载const
版operator[]
,这当然只支持查找。
编辑:我现在在你的代码中注意到你正在返回一个指针。如果要对std :: map使用的operator[]
使用插入/查找范例,则返回引用更有意义。返回指针可以为您提供以下优势:您可以检查operator[]
的返回值是否为NULL以检查密钥是否不存在,但同样,如果您希望operator[]
同时提供查找和插入功能,参考将是这里的方式。