std::map<int,int> mapy;
++mapy[5];
假设mapy[5]
始终为1是否安全?我的意思是,mapy[5]
总是在'++'之前得到默认值0,即使没有明确声明,就像我的代码一样?
答案 0 :(得分:91)
只要您使用[]运算符访问地图,如果该密钥不存在,则会添加该密钥。调用int类型的默认初始值设定项 - 因此它将获得值0。
答案 1 :(得分:17)
是的,可以安全地假设。
因此指定了地图的operator[]
:([map.access])
除了效果:如果地图中没有等效于
x
的键,请将value_type(std::move(x), T())
插入地图。
返回:对mapped_type
中与x
对应的*this
的引用。
T()
([expr.type.conv] / 2)之外, T
对所有void
使用 value-initialisation 和 value-initialisation 原语导致零初始化 ([dcl.init] / 7)。
因此,表达式求值为对值为零([dcl.init] / 5)的对象的引用。
然后operator++
调用将该对象增加为1,并计算为1。
(所有引用都是C ++ 11。)
答案 2 :(得分:8)
是,默认值将是该类型的默认值。如果你想要另一个默认值,你可以创建一个行为类似于int但具有不同默认构造函数的类。
答案 3 :(得分:2)
Rep_Movsd的答案过于简单,可能导致许多极其危险的错误观念。 C ++中的原始数据类型没有初始值设定项。路易斯·布兰迪有一个精彩的演讲,他讨论了许多在Facebook上发生的常见C ++错误,以及对std :: map&lt;&gt; []如何工作的误解是他讨论的错误之一,这是一个很好的资源,尽管他没有关于std :: map&lt;&gt; []实际如何工作的交易。
通常,int没有初始化,并且像所有原始类型一样未定义。当与std :: map&lt;&gt; []一起使用时,int通过称为值初始化的过程设置了默认值零。值初始化是一个实际上与结构一起使用的过程。例如,
struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};
将始终将int初始化为零。如果成员变量是其他原始类型,则它们也具有特定的初始化值。例如,通过值初始化初始化以下类型,如下所述:
bool =假
float = 0.0f
enum =(枚举类型)0
pointer =空指针
指向member = null成员指针的指针
使用未明确初始化的数据时要格外小心。最后一点,请考虑以下代码
map<string, int> myMap;
cout << myMap["Foo"];
此代码不仅会始终将整数初始化为0,而且还会在地图中插入0。简单来说,如果没有初始化,原始数据类型是未定义的,但在某些情况下,例如使用struct或map值,初始化将使用特定值初始化原始数据。