C++ 运算符 [] 语法

标签 c++ dictionary operators operator-overloading

只是一个简单的语法问题。我正在编写一个 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/

相关文章:

c++ - 使用AKAZE时opencv 3.0下和windows 7下mingw下的异常

c++ - 如何将 "jni/*.c/cpp"文件添加到 CMakeLists.txt 文件?

python - 如何返回包含属于多个字典列表的项目的最长字典列表的字典?

javascript - 使用下拉框更改运算符来操作输入框

swift - 如何使用 "OR"在 Swift 中比较字符串

c++ - GCC 消耗太多内存!!图形工具

c++ - 预处理器指令在 for 循环中不起作用

scala - 如何计算多重映射的逆

ios - Swift 字典映射 - 在闭包中初始化

java - 条件或运算符(||)的短路行为