【问题标题】:Does STL Map auto-initialize values? [duplicate]STL Map 是否自动初始化值? [复制]
【发布时间】:2012-10-15 04:56:58
【问题描述】:

可能重复:
Why does a class used as a value in a STL map need a default constructor in …?

当我使用地图时,值肯定会被初始化为默认值还是我不应该依赖这个?

例如,假设我有以下代码:

map<string, int> myMap;
cout << myMap["Hey"];

这将使用我的编译器输出“0”。这是有保证的行为吗?这可能不会总是初始化为 0?

【问题讨论】:

  • 不是重复的。上面链接的问题是关于用作映射值的结构中的原始类型。这是关于将原始类型直接用作值。

标签: c++ stl map


【解决方案1】:

标准:

ISO/IEC 14882 §23.4.4.3

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

  1. 效果: 如果映射中没有与x 等效的键,则将value_type(x, T()) 插入映射中。
  2. 要求: key_type 应为 CopyConstructiblemapped_type 应为 DefaultConstructible
  3. 返回:mapped_type 的引用,对应于*this 中的x
  4. 复杂性: 对数。

因此,不仅可以保证,而且评估 myMap["Hey"] 还会导致值 0 插入到地图中,如果之前没有条目的话。

【讨论】:

  • 你还必须知道int()==0
【解决方案2】:

它的值构造了一个新键的值。看看some documentation

 A call to this function is equivalent to:
 insert(
    make_pair(x,T())
 );

这将转化为

 insert(make_pair("Key", int()));

所以是的:你的价值观一开始会是零。

【讨论】:

  • 这不是默认构造。是价值建构。这是至关重要的;默认构造的ints 具有未定义的值,而构造值的ints 具有值0
  • 我一直把两者混为一谈。感谢您的评论。编辑了错误。
  • 更正:这是值初始化,而不是构造。显然。关键是它不是默认构造:)
  • 涵盖在标准的 C++11 8.5p1-10,16 中关于使用 () 进行值初始化,以防万一有人远程感兴趣(至少在我的副本中)。具体来说,p7,它在值初始化时有一个默认的零初始化条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2010-10-05
相关资源
最近更新 更多