只是一个简单的语法问题。我正在编写一个 map 类(用于学校)。
如果我定义以下运算符重载:
template<typename Key, typename Val> class Map {...
Val* operator[](Key k);
当用户写入时会发生什么:
Map<int,int> myMap;
map[10] = 3;
做类似的事情只会覆盖键 k 处 [null] 指针的临时拷贝。甚至可以这样做:
map[10] = 3;
printf("%i\n", map[10]);
具有相同的运算符重载?
最佳答案
它与 std::map
一起工作的方式是,如果键不存在,map 类将插入一个默认值,然后返回一个左值(对值的可分配引用与键相关联),因此可以为其分配一个新值。
因此,在下面的代码示例中,假设 map
为空,这会将 10 插入到映射中并将其与值 3 相关联。
map[10] = 3;
对于您的自定义映射类,operator[]
应首先检查键 k 是否存在,如果不存在,则插入一个新的键/值对(使用 typename Val 的默认构造函数
) 到 map 中。然后,您可以返回对与新键关联的值的引用,以便用户可以为其分配值。请注意,这意味着 Val 必须是可分配的并且具有默认构造函数。
这允许 operator[]
用于插入和查找。您还应该重载 operator[]
的 const
版本,它当然只支持查找。
编辑:我现在在您的代码中注意到您正在返回一个指针。如果您想对 std::map 使用的 operator[]
使用插入/查找范例,则返回引用更有意义。返回指针的好处是您可以检查 operator[]
的返回值是否为 NULL 以检查键是否不存在,但同样,如果您需要 operator[]
以提供查找和插入功能,引用将是前往此处的方式。
关于C++ 运算符 [] 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658821/