【问题标题】:std::map::operator[]std::map::operator[]
【发布时间】:2017-02-27 03:03:36
【问题描述】:

我正在做一个简单的地图程序,但最终得到了这个问题。 c++ 文档是这样说的:

访问元素 如果 k 匹配容器中元素的键,则该函数返回对其映射值的引用。 如果 k 不匹配容器中任何元素的键,则该函数使用该键插入一个新元素并返回对其映射值的引用。请注意,这总是将容器大小增加一,即使没有为元素分配映射值(该元素是使用其默认构造函数构造的)。

我没有真正理解的部分是它说“该元素是使用其默认构造函数构造的”。

我试了一下,做了这个

std::map<string, int> m;
m["toast"];

我只是想看看“toast”的映射元素是什么值。它最终为零,但是,为什么?原始类型是否有默认构造函数?或者发生了什么?

【问题讨论】:

  • 这个所谓的“c++ doc”是什么?听起来不是很准确。
  • (地图元素是值初始化的。)
  • @KerrekSB 我应该使用哪一个?我只是使用 cplusplus.com 我做错了吗?
  • 那个网站has issues...
  • 谢谢@KerrekSB!我不知道!

标签: c++ dictionary initialization stdmap


【解决方案1】:

“使用其默认构造函数”的说法令人困惑。更准确地说,对于std::map::operator[],如果key不存在,则插入的值为value-initialized

当使用默认分配器时,这会导致键是从键复制构造的,映射的值是value-initialized

对于int,表示zero-initialization

4) 否则,对象被零初始化。

【讨论】:

  • 谢谢!我想我会使用 cppreference 而不是 cplusplus
【解决方案2】:

映射值由operator[]值初始化,对于int,意味着零初始化。

按照标准 (§23.4.4.3) 的定义:

效果:如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入映射中。

T() 解释为 (§8.5/10):

初始化器为空括号集的对象,即(),应进行值初始化 ​

这意味着(§8.5/8): ​

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

[...]

——否则,对象被零初始化。

并且零初始化被定义为(§8.5/6):

T 类型的对象或引用进行零初始化意味着:

—如果 T 是标量类型,则对象设置为值 0(零), 作为整数常量表达式,转换为T

[...]

所有引述均取自 n4140

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-24
    • 2016-08-28
    • 2016-10-03
    • 2013-10-12
    • 1970-01-01
    • 2018-12-20
    • 2010-09-18
    • 2018-01-28
    相关资源
    最近更新 更多