让我们假设我们有
map<int, int> count;
安全性(平台相关的,编译器问题)是count[x]++;
或count[x] += value;
x
和value
是整数的操作。
我想观察的行为如下:
count[x]++;
之后,我应该count[x]=1
,即 int应该初始化为0。这会因平台而异吗?作为参考,有一个关于类似问题here的问题但是它没有回答平台相关/编译器相关部分。
换句话说,count[x]++;
或count[x] += value;
始终有效。
答案 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
将默认构造一个新实例,将其放入地图并返回引用。
由于此处的值为int
,int
默认构造为0
,就像您int()
一样,它将始终按预期工作< /强>