我正在尝试在C ++中实现像std::map这样的容器。重载operator []时我有一个小查询。我看到这个操作符有两种工作方式:
mymap[2]
- 在这种情况下,它会在地图中查找键2,并根据此键返回值。mymap[2]=3
- 在这种情况下,它会在地图中查找键2,如果找不到键,则会在地图中插入3。我看到这个运算符的声明看起来像:Mapped_T &operator[](const Key_T &);
但是我没有得到的是,如果找不到密钥,我将不得不在Map中插入一个新元素但是在operator []的声明中功能我看不到任何地方传递的价值。那么重载运算符如何知道插入键的值是什么?
答案 0 :(得分:4)
当密钥不存在时,std::map
使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。
答案 1 :(得分:3)
它会被初始化 - 就像使用{}
一样,这里有一些伪代码:
Mapped_T & operator[](const Key_T &k) {
if(!has_key(k))
insert(k, Mapped_T{});
return at(k);
}
您问题的重要部分是Mapped_T{}
。对于聚合,它意味着零初始化,对于具有默认构造函数的类,它意味着使用该构造函数。