地图上count [x] ++的安全性如何

时间:2013-05-30 14:16:00

标签: c++ stl initialization

让我们假设我们有

map<int, int> count;

安全性(平台相关的,编译器问题)是count[x]++;count[x] += value; xvalue是整数的操作。

我想观察的行为如下:

  • 如果密钥不存在,那么在执行count[x]++;之后,我应该count[x]=1 ,即 int应该初始化为0。这会因平台而异吗?
  • 如果存在,操作员应按预期工作增加值。

作为参考,有一个关于类似问题here的问题但是它没有回答平台相关/编译器相关部分。

换句话说,count[x]++;count[x] += value;始终有效。

3 个答案:

答案 0 :(得分:11)

  

如果密钥不存在,那么在执行count [x] ++;之后,我应该有count [x] = 1,即int应该为0初始化。这会因平台而异。

不,它不会改变。该值将为值初始化。因此,如果类型是基本类型,例如int,则会将其初始化为0。这由C ++ 11标准的第23.4.4.3/1段规定:

T& operator[](const key_type& x);
     

1 效果:如果地图中没有等效于x的键,请将value_type(x, T())插入地图。

T()对应于值初始化的事实在第8.5 / 17段中规定:

  

初始化器的语义如下。 [...]

     

[...]

     

- 如果初始化程序为(),则对象已初始化值

     

[...]

最后,根据第8.5 / 8段:

  

value-initialize T类型的对象意味着:

     

- 如果T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者   用户提供或删除的默认构造函数,然后该对象被默认初始化;

     

- 如果T是一个(可能是cv限定的)非联合类类型,没有用户提供或删除的默认构造函数,   那么该对象是零初始化的,如果T有一个非平凡的默认构造函数,则默认初始化;

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化

下一个问题:

  

如果存在,操作员应按预期工作,即增加值。

是(当然是模运算符重载)。

答案 1 :(得分:2)

如果映射中的整数和其他原始C ++类型不存在,则将其初始化为零。其他类型使用它们的默认构造函数进行初始化(如果默认构造函数没有做好工作,当然可以给出一些有趣的结果......)

但是如果我们假设基本的C ++类型,那么count[x]++就可以了。

答案 2 :(得分:1)

如果您执行count[x]++,其中密钥x不存在,map将默认构造一个新实例,将其放入地图并返回引用。

由于此处的值为intint默认构造为0,就像您int()一样,它将始终按预期工作< /强>