【问题标题】:std::map calls default constructor on [], copy constructor on insert()std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
【发布时间】:2018-06-09 01:18:20
【问题描述】:

我的 std::map 被称为 uniformBlocks。当我注意到一些奇怪的事情时,我正在测试添加新元素的方法。当我添加新的键值对时,使用以下方法:

uniformBlocks["MatrixBlock"] = matrixBlock;

调用默认构造函数。但是,当我使用 insert 时,会调用复制构造函数,这是意料之中的。

uniformBlocks.insert(
    std::pair<const std::string, glWrapper::UBO>("MatrixBlock", matrixBlock)
);

为什么这两种方法有区别。他们不是以同样的方式实现的吗?

【问题讨论】:

  • 一旦使用 copy-ctor 构造,其他默认构造,然后复制分配。所以不,它们在引擎盖下是不一样的。
  • @WhozCraig 非常感谢。你知道哪个更快吗?另外,请发表您的答案,以便我接受
  • 究竟是什么阻止您尝试任何一种方法,然后对结果进行计时以查看哪种方法更快?
  • @ManhNguyen Yakk 很好地介绍了它。我确定这是一个骗子(现在几乎所有的图书馆和语言问题都是),但我只是没有时间去寻找它。很高兴它有帮助。祝你好运。

标签: c++ stdmap


【解决方案1】:

[] 如果对象不存在则创建一个对象,然后返回对它的引用。那时,没有可用的参数。

= 然后分配给这个引用。

insert 不需要这样做。它可以简单地使用您传入的对来构建。

小心使用,emplace 甚至可以取消复制或移动 ctor 调用。

【讨论】:

  • 同样重要的是,insert 有一个额外的好处,它可以返回一段美味的数据,通知调用者该键是否在之前存在,并且不管那个​​,迭代器在插入元素的映射中的位置.从insert 返回的std::pair&lt;iterator, bool&gt; 可以非常派上用场。
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2014-03-24
相关资源
最近更新 更多