map <int,int>默认值</int,int>

时间:2010-04-19 12:31:55

标签: c++ dictionary default

std::map<int,int> mapy;
++mapy[5];

假设mapy[5]始终为1是否安全?我的意思是,mapy[5]总是在'++'之前得到默认值0,即使没有明确声明,就像我的代码一样?

4 个答案:

答案 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值,初始化将使用特定值初始化原始数据。