问题标签 [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.
c++ - 为什么我需要在 map::emplace 中为不可复制对象的单个 arg 构造函数使用分段构造?
以下代码无法在 gcc 4.8.2 上编译。问题是此代码将尝试复制由于缺少复制和移动构造函数std::pair<int, A>
而无法发生的构造。struct A
gcc 在这里失败还是我错过了什么?
c++ - 如何将不可复制类的默认构造对象放置到 boost::container::map 中?
考虑以下 C++03 代码(我必须使代码与 C++11 之前的编译器兼容):
在这里使用 Boost 映射,因为它甚至可以在 C++03 中进行放置。问题是,如果使用单参数构造函数,我可以完美地将构造嵌入到地图中,但我不知道如何默认构造对象,如下代码所示:
第二次调用失败,因为它被视为对 emplace(std::pair...) 重载的调用,所以似乎没有办法“default-emplace”。
有什么方法可以实现我想要的吗?
c++ - 高效优雅地返回已放置的 unique_ptr
我发现(感谢 StackOverflow 评论)我的代码中有一个安全漏洞:
基本上,如果抛出Item
,使用 raw分配new
可能会泄漏内存。emplace_back
解决方案从不使用 raw new
,而是std::unique_ptr
在方法主体中使用 right 。
如您所见,返回item
是无效的,因为我不得不移动item
使用std::move
将其放入items
容器中。
我想不出需要将item
' 的地址存储在附加变量中的解决方案。然而,原始(错误)解决方案非常简洁且易于阅读。
有没有更优雅的方式来返回一个std::unique_ptr
被移动以放置在容器中的东西?
c++ - 对于对象地图,我可以放置对象,还是只是配对?
我正在使用 C++ 11 和 gcc-4.7.0。我正在寻找 STL 解决方案。
我想要一个未排序的多图,其中包含 myClass 的对象,其中短字符串作为键。Emplace 看起来像是在我构造对象时将对象放入地图的好方法,但我不确定它是否可以做到这一点,或者它是否只会构造键/对象对。这应该是有效的:
但是执行以下操作会更有效吗?它甚至是有效的代码吗?
c++ - set::emplace 如何处理已经在集合中的对象?
我有一组对象,我想使用 emplace 将对象添加到集合中。如果集合中尚不存在等效对象,则 set::emplace 创建一个对象并将其放入集合中。如果集合已经有一个等价对象,set::emplace 不会将对象添加到列表中。在这种情况下,它是创建对象并销毁它,创建它并泄漏它,还是根本不创建它?或者它会做其他事情吗?
C++ 11,GCC 4.7.0
c++ - 无法 emplace_back 具有 const 成员的类的实例
我在具有 const 成员的类的实例上使用“emplace_back”时遇到问题。
请参阅下面的示例代码清单。
编译错误:
看到这个错误信息:
我尝试定义一个赋值运算符(以及移动和复制构造函数,以及一个析构函数)以确保隐式生成的运算符不会以某种方式变为私有。这并没有改变什么。在这种情况下,我不明白为什么赋值运算符被“显式删除”。
请注意,将类成员更改为非常量不会导致编译错误。
c++ - std::unordered_map::emplace 对象创建
我正在选择将事物放入 unordered_map 的两种方法之一:
对比
我做了一些实验,看看哪一个表现更好,发现在插入独特元素时,行为(如效率)基本上是等效的。
但是,在插入重复项的情况下,考虑到Value或DifferentialValue的构造并非易事,我惊讶地发现,无论插入与否,emplace都会构造对象。
因此,在这种情况下,第二种方法似乎到目前为止更胜一筹,因为默认构造函数中只有 isDefaultInitialized_(true) ,仅此而已。
对于 emplace,代码似乎是:
所以,虽然我将使用第二种方法(即使它需要移动赋值和移动构造函数和额外的字段),我想知道为什么 emplace 创建一个后来忽略的对象有很好的理由吗?也就是说,它是否应该首先检查它是否需要创建对象,如果它已经存在则提前退出?
(请注意,对于我的特殊情况,默认初始化项不被认为是有效的,所以问题实际上只是关于 emplace)
作为记录,我在 23.2.4 表 102 下发现了一些东西:
我认为这将允许不创建对象。
c++ - 为什么 emplace_back 比 push_back 快?
emplace_back
在做这样的事情时,我认为那将是赢家:
因为emplace_back
将立即在向量中构造对象,而push_back
将首先构造一个匿名对象,然后将其复制到向量中。有关更多信息,请参阅此问题。
我决定将它们与将由整数填充的向量进行比较。
下面是实验代码:
结果是emplace_back
更快。
为什么?第一个链接问题的答案清楚地表明不会有性能差异。
也尝试了其他时间方法,但得到了相同的结果。
[编辑] 评论说使用int
s 进行测试并没有说明任何内容,并且push_back
需要参考。
我在上面的代码中做了同样的测试,但是int
我有一个类A
:
结果:
[编辑.2]
正如登兰所说,我也应该改变操作的位置,所以我交换了它们,在两种情况下(int
和class A
),emplace_back
再次成为赢家。
[解决方案]
我在 中运行代码debug mode
,这使得测量值无效。对于基准测试,请始终在release mode
.
c++ - emplace 的性能比检查后的 emplace 差
我有一个没有默认构造函数std::unordered_map
的value_type,所以我不能执行以下操作
我最终写了一个辅助函数
但性能明显比以下版本差(即 value_type 的构造函数出现在 perf 中)。
我从std::unordered_map::emplace 对象创建中读到 emplace 需要构造对象才能查看是否存在。但是 emplace 会在返回之前检查这个键值对是否存在于映射中。
我是否以错误的方式使用 emplace?有没有更好的模式我应该遵循:
- 不会在每次查找时构造我的 value_type (就像我的第一个方法一样)
- 不会检查 value_type 是否存在于我的地图中两次(如在我的第二种方法中)
谢谢