- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我认为 emplace_back
会是赢家,当做这样的事情时:
v.push_back(myClass(arg1, arg2));
因为 emplace_back
会立即在 vector 中构造对象,而 push_back
会先构造一个匿名对象,然后将其复制到 vector 中。更多信息见 this问题。
我决定将它们比较为一个将由整数填充的 vector 。
这里是实验代码:
#include <iostream>
#include <vector>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
vector<int> v1;
const size_t N = 100000000;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v1.push_back(i);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "push_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
vector<int> v2;
t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v2.emplace_back(i);
t2 = high_resolution_clock::now();
time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "emplace_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
return 0;
}
结果是 emplace_back
更快。
push_back took me 2.76127 seconds.
emplace_back took me 1.99151 seconds.
为什么?第一个链接问题的答案清楚地表明不会有性能差异。
还尝试了其他 time methods ,但得到了相同的结果。
[编辑]评论说使用 int
s 进行测试并没有说明什么,并且 push_back
需要一个引用。
我在上面的代码中做了同样的测试,但是我有一个类 A
:
int
class A {
public:
A(int a) : a(a) {}
private:
int a;
};
结果:
push_back took me 6.92313 seconds.
emplace_back took me 6.1815 seconds.
[EDIT.2]
正如 denlan 所说,我还应该改变操作的位置,所以我交换了它们,在两种情况下(int
和 class A
),emplace_back
再次成为赢家。
[解决方案]
我在 debug 模式
下运行代码,这使得测量值无效。为了进行基准测试,请始终以 release 模式
运行代码。
最佳答案
您的测试用例不是很有帮助。 push_back
获取一个容器元素并将其复制/移动到容器中。 emplace_back
从那些新的容器元素中获取任意参数和构造。但是如果你将一个已经是元素类型的参数传递给 emplace_back
, 无论如何你只需要使用复制/移动构造函数。
这里有一个更好的比较:
Foo x; Bar y; Zip z;
v.push_back(T(x, y, z)); // make temporary, push it back
v.emplace_back(x, y, z); // no temporary, directly construct T(x, y, z) in place
然而,关键的区别在于 emplace_back
执行显式转换:
std::vector<std::unique_ptr<Foo>> v;
v.emplace_back(new Foo(1, 'x', true)); // constructor is explicit!
这个例子将来会稍微做作,当你应该说v.push_back(std::make_unique<Foo>(1, 'x', true))
时.但是,emplace
的其他结构非常好。 ,也:
std::vector<std::thread> threads;
threads.emplace_back(do_work, 10, "foo"); // call do_work(10, "foo")
threads.emplace_back(&Foo::g, x, 20, false); // call x.g(20, false)
关于c++ - 为什么 emplace_back 比 push_back 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717151/
我正在尝试创建执行搜索的线程 vector 。这是我的 SearchThread 类中的重要内容。 class SearchThread { explicit SearchThread
给定以下代码 测试.h: #ifndef __graph_aufbau_header__ #define __graph_aufbau_header__ #include #include #in
关于 someFunctionOne 和 someFunctionTwo。 当每个都放置到 map 中时,最终结果是否仍然相同? 指针是否升级为智能指针? struct MyStruct {
我对 emplace_back 的行为有点困惑。一起来看看吧。 struct innerObject { innerObject(int ); }; class outterObject {
我尝试将类 cBar 的两个实例放置到具有 emplace_back 函数的 vector 中。 根据reference调用 emplace_back 仅保留 vector 中的位置,然后“就地”创建
我想知道是否可以使用 emplace_back 将项目存储到 vector 中,emplace_back 是一种派生自 vector 所期望的类的类型。 例如: struct fruit {
这是我日常工作中的一段代码。我只想问你这两种情况有什么区别,尤其是在性能方面。 std::vector > aVec; // case 1 aVec.emplace_back("hello", "bo
我向你展示我的问题 我有 2 个列表,将它们命名为 A 和 B。 list > A = {{1},{2},{3}}; list > B = {{4},{5},{6}}; 我想要的是 A = {{1,4
#include #include using namespace std; class test{ public: test(){
似乎添加默认构造函数会阻止调用 emplace_back 并产生错误消息:“静态断言失败:类型不可分配”(gcc 5.3 with -std=c++14)。这是一个说明问题的简单代码: class A
我编写了一个简单的程序来尝试在标准库容器中就地创建对象。这是我写的: #include #include class AB { public: explicit AB(int n);
我想知道我是否正确理解emplace_back #include using namespace std; struct Hero { Hero(const string&) {}
这个问题在这里已经有了答案: Emplace an aggregate in std::vector (3 个答案) 关闭 4 年前。 为什么我可以直接调用构造函数,但是当我在 emplace_ba
我正在尝试为我的用户定义结构使用 emplace_back: #include #include #include struct IDNumber { IDNumber(std::vec
考虑下面的例子: #include #include class S { public: S() { puts("S()"); } S(int) { puts("S(int)"); }
我正在创建一个指向新对象的新指针,并立即将 push_front 放入双端队列。我想改为使用 emplace_front,但遇到编译器错误。 我的对象构造函数需要 1 个字符串参数。 std::deq
所以我一直在制作一个对象池类,它是这样使用的: class MagicTrick { public: MagicTrick(int magic) : _magic(magic) {}
#include #include struct T{ T(){ std::cout vec; vec.push_back(T()); vec.push_
我在实现我自己的模板类时遇到了困难,我想在其中添加我自己的 emplace_back 函数实现。由于我仍在学习模板设计,非常感谢您在这里提供意见。 template class MydataStru
这个问题在这里已经有了答案: emplace_back() does not behave as expected (2 个答案) 关闭 8 年前。 我很好奇这段代码的输出结果。 #include
我是一名优秀的程序员,十分优秀!