草庐IT

c++ - 在 emplace() 中创建对象时复制省略

我看到很多代码在工作中人们使用emplace和emplace_back和一个临时对象,像这样:structA{A::A(int,int);};vectorv;vector.emplace_back(A(1,2));我知道emplace_back的重点是能够直接传递参数,像这样:v.emplace_back(1,2);但不幸的是,这对少数人来说并不清楚。但我们不要纠缠于此......我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?供您引用...我们正在使用C++14。 最佳答案 Myquesti

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

以下代码无法在gcc4.8.2上编译。问题是此代码将尝试复制构造std::pair由于structA,这不可能发生缺少复制和移动构造函数。gcc在这里失败还是我遗漏了什么?#includestructA{intbla;A(intblub):bla(blub){}A(A&&)=delete;A(constA&)=delete;A&operator=(A&&)=delete;A&operator=(constA&)=delete;};intmain(){std::mapmap;map.emplace(1,2);//doesn'tworkmap.emplace(std::piecewise_

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

以下代码无法在gcc4.8.2上编译。问题是此代码将尝试复制构造std::pair由于structA,这不可能发生缺少复制和移动构造函数。gcc在这里失败还是我遗漏了什么?#includestructA{intbla;A(intblub):bla(blub){}A(A&&)=delete;A(constA&)=delete;A&operator=(A&&)=delete;A&operator=(constA&)=delete;};intmain(){std::mapmap;map.emplace(1,2);//doesn'tworkmap.emplace(std::piecewise_

c++ - 为什么vector.emplace_back 调用移动构造函数?

structObject{Object(){coutv;v.reserve(10);v.emplace_back(Object{});}这给了我以下输出:constructormoveconstructor为什么?我以为emplace_back确实在原地创建对象,因此不必调用复制或移动构造函数。来自描述:Theelementisconstructedin-place,i.e.nocopyormoveoperationsareperformed.编辑:啊,好吧,看来我从根本上误解了emplace_back()。您不必将Object作为参数,因为它是自动为您创建的。您只需将Object-c

c# - 是否有任何 C++11 emplace/emplace_back 函数的 C# 模拟?

从C++11开始,可以这样写#include#includestructS{S(intx,conststd::string&s):x(x),s(s){}intx;std::strings;};//...std::vectorv;//addnewobjecttothevectorv//onlyparametersofaddedobject'sconstructorarepassedtothefunctionv.emplace_back(1,"t");对于容器类(System.Collections.Generic.List),是否有任何C++函数的C#类似物,如emplace或empla

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

我正在选择将事物放入unordered_map的两种方法之一:std::unordered_mapmap;map.emplace(std::piecewise_construct,std::forward_as_tuple(a),std::forward_as_tuple(b,c,d));对比std::unordered_mapmap;auto&value=map[a];if(value.isDefaultInitialized())value=DifferentValue(b,c,d);我做了一些实验,看看哪个表现更好,发现插入唯一元素时,行为(如效率)基本相同。但是,在插入重复项的

c++ - 用什么代替 std::map::emplace?

对于容器,例如std::map>,它看起来像emplace()截至gcc4.7.2尚未在stdc++中实现。不幸的是,我不能按值直接存储Foo,因为它是一个抽象父类(superclass)。作为一个简单但低效的占位符,我一直在使用std::map结合std::vector>用于垃圾收集。一旦emplace()可用,您是否有更高效且更容易替换的临时解决方案? 最佳答案 你需要emplace()做什么?只需将其移入:#include#include#include#includestructFoo{virtual~Foo()=defau

c++ - 如何实现具有 placement new 和 emplace 功能的简单容器?

我需要实现一个容器来容纳一定数量的元素,出于某种原因,它必须在没有任何堆分配的情况下工作。另一个要求是,不应以任何方式复制或移动容器元素。它们必须直接构造到容器分配的内存中。为此,我决定使用placementnew并将内存管理完全委托(delegate)给容器实现(在drdobbs找到了一些关于placementnew的有用信息)。找到一个正在运行的例子here.(请注意,使用newuint8_t[size]和std::queue只是为了让示例保持简单。我的真实代码更复杂,无堆而不是实现。)到目前为止,这非常有效,因为客户端代码必须通过以下调用将元素放入容器中:executer.pus

c++ - 为什么 c++17 的 emplace() 函数没有引用资格?

C++17引入了一些新的函数签名emplace_back()类型函数(std::optional也有一个),但它们不是引用限定的。这允许emplace_back()在临时对象上调用并绑定(bind)到左值引用,即使对象的生命周期没有延长。请考虑以下事项:#include#include#includestructA{A(inti):i(i){std::cout().emplace(5);std::cout().emplace_back(5);std::cout(std::in_place,5).value();autoconst&a2=std::optional(std::in_pla

c++ - std::vector::emplace_back 比 std::vector::push_back 慢的示例?

我目前正在阅读ScottMeyer的“EffectiveModernC++”。在第42项中,他声称,例如std::vector::emplace_back通常(但不总是)与使用push_back一样快,甚至更快。他列出了三个条件,在这些条件下它至少应该一样快,但没有提供在这些条件不全部满足的情况下的反例。有人可以给我提供一个示例,说明使用emplace_back会导致比使用push_back更差的性能吗? 最佳答案 这取决于您所说的“emplace_back比push_back慢”是什么意思。考虑构造成本高而复制成本低的类,例如具有