【问题标题】:Why is the [] operator of C++ Map calling default constructor of mapped-value? [duplicate]为什么 C++ Map 的 [] 运算符调用映射值的默认构造函数? [复制]
【发布时间】:2015-01-17 15:58:08
【问题描述】:

我用g++编译了如下代码,执行该行时会调用构造函数A():

m["1"]

为什么会这样?我认为这里没有必要调用构造函数。

struct A
{
   int mem;
   A(int arg){}
   A(){}
};
int main()
{
   unordered_map<string, A> m;
   m["1"]; // will call A(), but why?
   m.find("1")->second; // will not call A()
}

【问题讨论】:

  • 因为如果它不存在,它需要构造一个“空”对象。否则,当指定的键不存在时,它可能会返回什么?
  • map的[]操作符尝试访问指定的索引,如果没有找到,它会在指定的索引处为你创建一个,设置为映射值类型的默认值,在这种情况下调用构造函数
  • 表达式m["1"]的值应该是多少?
  • 然而,即使我写成:m["1"] = A(1); A() 仍然会被调用。
  • @KaiWang 是的,它会的,原因完全相同。这里没有任何问题。

标签: c++ map


【解决方案1】:

这就是operator[]的设计。如果他没有找到您正在查看的值,则使用默认构造函数创建该条目。

如果你想查看一个元素是否存在而不需要创建它,你可以使用find() 代替。

如果您想像使用 operator[] 一样处理元素,但如果找不到该元素则抛出异常而不是创建丢失的条目,您更喜欢 at()

【讨论】:

  • 谢谢。但即使我写成: m["1"] = A(1); A() 仍然会被调用。
  • @KaiWang,operator[] 必须在分配发生之前返回一个引用,所以它仍然需要初始化一个位置。
  • 这是有道理的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多