问题标签 [emplace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
392 浏览

c++ - struct emplace_back 的 3D 向量

这是行不通的。原因对我来说很神秘。

PS:使用 C++11

http://ideone.com/elopRc

0 投票
1 回答
9582 浏览

c++ - 为什么我需要在 map::emplace 中为不可复制对象的单个 arg 构造函数使用分段构造?

以下代码无法在 gcc 4.8.2 上编译。问题是此代码将尝试复制由于缺少复制和移动构造函数std::pair<int, A>而无法发生的构造。struct A

gcc 在这里失败还是我错过了什么?

0 投票
3 回答
494 浏览

c++ - 如何将不可复制类的默认构造对象放置到 boost::container::map 中?

考虑以下 C++03 代码(我必须使代码与 C++11 之前的编译器兼容):

在这里使用 Boost 映射,因为它甚至可以在 C++03 中进行放置。问题是,如果使用单参数构造函数,我可以完美地将构造嵌入到地图中,但我不知道如何默认构造对象,如下代码所示:

第二次调用失败,因为它被视为对 emplace(std::pair...) 重载的调用,所以似乎没有办法“default-emplace”。

有什么方法可以实现我想要的吗?

0 投票
3 回答
801 浏览

c++ - 高效优雅地返回已放置的 unique_ptr

我发现(感谢 StackOverflow 评论)我的代码中有一个安全漏洞:

基本上,如果抛出Item,使用 raw分配new可能会泄漏内存。emplace_back

解决方案从不使用 raw new,而是std::unique_ptr在方法主体中使用 right 。

如您所见,返回item是无效的,因为我不得不移动item使用std::move将其放入items容器中。

我想不出需要将item' 的地址存储在附加变量中的解决方案。然而,原始(错误)解决方案非常简洁且易于阅读。

有没有更优雅的方式来返回一个std::unique_ptr被移动以放置在容器中的东西?

0 投票
1 回答
3457 浏览

c++ - 对于对象地图,我可以放置对象,还是只是配对?

我正在使用 C++ 11 和 gcc-4.7.0。我正在寻找 STL 解决方案。

我想要一个未排序的多图,其中包含 myClass 的对象,其中短字符串作为键。Emplace 看起来像是在我构造对象时将对象放入地图的好方法,但我不确定它是否可以做到这一点,或者它是否只会构造键/对象对。这应该是有效的:

但是执行以下操作会更有效吗?它甚至是有效的代码吗?

0 投票
2 回答
420 浏览

c++ - set::emplace 如何处理已经在集合中的对象?

我有一组对象,我想使用 emplace 将对象添加到集合中。如果集合中尚不存在等效对象,则 set::emplace 创建一个对象并将其放入集合中。如果集合已经有一个等价对象,set::emplace 不会将对象添加到列表中。在这种情况下,它是创建对象并销毁它,创建它并泄漏它,还是根本不创建它?或者它会做其他事情吗?

C++ 11,GCC 4.7.0

0 投票
1 回答
1204 浏览

c++ - 无法 emplace_back 具有 const 成员的类的实例

我在具有 const 成员的类的实例上使用“emplace_back”时遇到问题。

请参阅下面的示例代码清单。

编译错误:

看到这个错误信息:

我尝试定义一个赋值运算符(以及移动和复制构造函数,以及一个析构函数)以确保隐式生成的运算符不会以某种方式变为私有。这并没有改变什么。在这种情况下,我不明白为什么赋值运算符被“显式删除”。

请注意,将类成员更改为非常量不会导致编译错误。

0 投票
2 回答
3158 浏览

c++ - std::unordered_map::emplace 对象创建

我正在选择将事物放入 unordered_map 的两种方法之一:

对比

我做了一些实验,看看哪一个表现更好,发现在插入独特元素时,行为(如效率)基本上是等效的。

但是,在插入重复项的情况下,考虑到Value或DifferentialValue的构造并非易事,我惊讶地发现,无论插入与否,emplace都会构造对象。

因此,在这种情况下,第二种方法似乎到目前为止更胜一筹,因为默认构造函数中只有 isDefaultInitialized_(true) ,仅此而已。

对于 emplace,代码似乎是:

所以,虽然我将使用第二种方法(即使它需要移动赋值和移动构造函数和额外的字段),我想知道为什么 emplace 创建一个后来忽略的对象有很好的理由吗?也就是说,它是否应该首先检查它是否需要创建对象,如果它已经存在则提前退出?

(请注意,对于我的特殊情况,默认初始化项不被认为是有效的,所以问题实际上只是关于 emplace)

作为记录,我在 23.2.4 表 102 下发现了一些东西:

我认为这将允许不创建对象。

0 投票
1 回答
51583 浏览

c++ - 为什么 emplace_back 比 push_back 快?

emplace_back在做这样的事情时,我认为那将是赢家:

因为emplace_back将立即在向量中构造对象,而push_back将首先构造一个匿名对象,然后将其复制到向量中。有关更多信息,请参阅问题。

谷歌也给出了这个这个问题。

我决定将它们与将由整数填充的向量进行比较。

下面是实验代码:

结果是emplace_back更快。

为什么?第一个链接问题的答案清楚地表明不会有性能差异。

也尝试了其他时间方法,但得到了相同的结果。

[编辑] 评论说使用ints 进行测试并没有说明任何内容,并且push_back需要参考。

我在上面的代码中做了同样的测试,但是int我有一个类A

结果:

[编辑.2]

正如登兰所说,我也应该改变操作的位置,所以我交换了它们,在两种情况下(intclass A),emplace_back再次成为赢家。

[解决方案]

我在 中运行代码debug mode,这使得测量值无效。对于基准测试,请始终在release mode.

0 投票
3 回答
2013 浏览

c++ - emplace 的性能比检查后的 emplace 差

我有一个没有默认构造函数std::unordered_mapvalue_type,所以我不能执行以下操作

我最终写了一个辅助函数

但性能明显比以下版本差(即 value_type 的构造函数出现在 perf 中)。

我从std::unordered_map::emplace 对象创建中读到 emplace 需要构造对象才能查看是否存在。但是 emplace 会在返回之前检查这个键值对是否存在于映射中。

我是否以错误的方式使用 emplace?有没有更好的模式我应该遵循:

  1. 不会在每次查找时构造我的 value_type (就像我的第一个方法一样)
  2. 不会检查 value_type 是否存在于我的地图中两次(如在我的第二种方法中)

谢谢