草庐IT

c++ - VS2013 下的 emplace_back() 问题

考虑以下代码std::vectornums{21,22,23,24};nums.emplace_back(nums[0]);nums.emplace_back(nums[1]);for(auton:nums){std::coutVS2013的输出21222324-1789160222为什么-17891602在这里?GCC4.8.4的输出正确如下212223242122那我比较VS2013和GCC的emplace_back的实现VS2013templatevoidemplace_back(_Valty&&..._Val){//insertbymovingintoelementatendi

c++ - 使用初始化列表放置 vector

我有一个std::vector>并想在它的末尾添加一些元素所以这是我的试验:std::vector>vec;vec.emplace_back({0,0});但这不会编译,而以下会编译:std::vectorvector({0,0});为什么emplace_back不能在这个位置构造元素?还是我做错了什么?感谢您的帮助。 最佳答案 前面的答案提到,当您在行中构造vector并将其放置时,您可以获得要编译的代码。但是,这意味着您在临时vector上调用move-constructor,这意味着您没有就地构造vector,而这就是使用em

c++ - 使用初始化列表放置 vector

我有一个std::vector>并想在它的末尾添加一些元素所以这是我的试验:std::vector>vec;vec.emplace_back({0,0});但这不会编译,而以下会编译:std::vectorvector({0,0});为什么emplace_back不能在这个位置构造元素?还是我做错了什么?感谢您的帮助。 最佳答案 前面的答案提到,当您在行中构造vector并将其放置时,您可以获得要编译的代码。但是,这意味着您在临时vector上调用move-constructor,这意味着您没有就地构造vector,而这就是使用em

c++ - 为什么 emplace_back 需要移动构造函数

我有以下代码:#include#include#includeclassTestfinal{public:Test(conststd::string&s):s_(s){std::coutv;v.emplace_back("emplace_back");}当允许移动构造函数时,会发生以下情况:[matttest]g++-std=c++11main.cpp&&./a.outconstructing:emplace_back但是,如果移动构造函数被移除:[matttest]g++-std=c++11main.cpp-DNO_MOVE&&./a.out/usr/lib/gcc/x86_64-r

c++ - 为什么 emplace_back 需要移动构造函数

我有以下代码:#include#include#includeclassTestfinal{public:Test(conststd::string&s):s_(s){std::coutv;v.emplace_back("emplace_back");}当允许移动构造函数时,会发生以下情况:[matttest]g++-std=c++11main.cpp&&./a.outconstructing:emplace_back但是,如果移动构造函数被移除:[matttest]g++-std=c++11main.cpp-DNO_MOVE&&./a.out/usr/lib/gcc/x86_64-r

c++ - 为什么 unordered_map "find + insert"比 "insert + check for success"快?

我使用unordered_map作为稀疏3D数组(128x128x128)将值插入到网格中,前提是网格单元仍然空闲。到目前为止,我总是使用find()检查单元格是否空闲,如果是,那么我使用insert()或emplace()添加了一个元素。现在我发现我可以使用insert和emplace的返回值来检查元素是否已添加,或者map中是否已经存在具有相同键的元素。我认为这可以提高性能,因为我可以完全删除find的使用。事实证明,不是通过插入而不查找来提高性能,而是性能实际上下降了,我不知道为什么。我已将我的应用程序简化为这个示例,其中点是随机生成的,然后插入到网格中。#include#inc

c++ - 为什么 unordered_map "find + insert"比 "insert + check for success"快?

我使用unordered_map作为稀疏3D数组(128x128x128)将值插入到网格中,前提是网格单元仍然空闲。到目前为止,我总是使用find()检查单元格是否空闲,如果是,那么我使用insert()或emplace()添加了一个元素。现在我发现我可以使用insert和emplace的返回值来检查元素是否已添加,或者map中是否已经存在具有相同键的元素。我认为这可以提高性能,因为我可以完全删除find的使用。事实证明,不是通过插入而不查找来提高性能,而是性能实际上下降了,我不知道为什么。我已将我的应用程序简化为这个示例,其中点是随机生成的,然后插入到网格中。#include#inc

c++ - vector 的 emplace_back

您能解释一下“完美转发”的工作原理吗?我读到vector的emplace_back不需要复制或移动对象,因为它的参数是作为可变参数模板实现的。std::vector::emplace_back(_Args&&...__args)你能详细描述一下吗?为什么不复制也不移动? 最佳答案 emplace_back直接在vector中的正确位置构造元素。想想就好像vectorv;v.emplace_back(a,b,c);转化为(idx为新索引)new(v.data()+idx)T(a,b,c);(实际情况有点复杂,涉及将参数转发为std::

c++ - vector 的 emplace_back

您能解释一下“完美转发”的工作原理吗?我读到vector的emplace_back不需要复制或移动对象,因为它的参数是作为可变参数模板实现的。std::vector::emplace_back(_Args&&...__args)你能详细描述一下吗?为什么不复制也不移动? 最佳答案 emplace_back直接在vector中的正确位置构造元素。想想就好像vectorv;v.emplace_back(a,b,c);转化为(idx为新索引)new(v.data()+idx)T(a,b,c);(实际情况有点复杂,涉及将参数转发为std::

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