3

让我们假设我们有

map<int, int> count;

操作的安全性(取决于平台,编译器问题)count[x]++;或整数的count[x] += value;位置x和位置。value

我想观察的行为如下:

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

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

换句话说,将count[x]++;count[x] += value;总是有效。

4

3 回答 3

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 段:

对类型对象进行值初始化T意味着:

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

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

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

否则,对象是零初始化的

下一个问题:

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

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

于 2013-05-30T14:18:45.663 回答
2

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

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

于 2013-05-30T14:18:28.573 回答
1

如果您count[x]++在键x不存在的地方执行此操作,map则会默认构造一个新实例,将其放入地图并返回引用。

由于您在此处的值是int,并且int默认构造为0就像您一样 make int()所以它将始终按预期工作

于 2013-05-30T14:19:27.610 回答