emplace_back()和push_back()的对比,前者不能替代后者的例子


文章目录

  • 测试代码:emplace_back()少一次复制操作,所以效率更高
  • emplace_back()无法替代push_back()的例子

测试代码:emplace_back()少一次复制操作,所以效率更高 这俩代码都是别的网友写的,我看到觉得很棒,搬移故来了
这个代码说明参数为左值引用的push_back方法要调用构造函数和复制构造函数,说明确实要先构造一个临时对象,再把临时对象用copy构造拷贝到数组最后面,确实费时。
#include #include #include using namespace std; class A { public: A(int i){ str = to_string(i); cout << "构造函数" << endl; } ~A(){} A(const A& other): str(other.str){ cout << "拷贝构造" << endl; } public: string str; }; int main() { vector vec; vec.reserve(10); for(int i=0; i<10; i++){ vec.push_back(A(i)); //调用了10次构造函数和10次拷贝构造函数, //vec.emplace_back(i); //调用了10次构造函数一次拷贝构造函数都没有调用过 } }

下面这个代码详细分析了五种原型,左值参数的,右值参数的push_back,以及emplace_back。发现:
  • 左值参数的push_back要调用构造函数和复制构造
  • 右值参数的push_back要调用构造函数和移动构造
  • emplace_back要调用一次构造而已
#include #include #include "time_interval.h"class Foo { public: Foo(std::string str) : name(str) { std::cout << "constructor" << std::endl; } Foo(const Foo& f) : name(f.name) { std::cout << "copy constructor" << std::endl; } Foo(Foo&& f) : name(std::move(f.name)){ std::cout << "move constructor" << std::endl; }private: std::string name; }; int main() {std::vector v; int count = 10000000; v.reserve(count); //预分配十万大小,排除掉分配内存的时间{ TIME_INTERVAL_SCOPE("push_back T:"); Foo temp("ceshi"); v.push_back(temp); // push_back(const T&),参数是左值引用 //打印结果: //constructor //copy constructor }v.clear(); { TIME_INTERVAL_SCOPE("push_back move(T):"); Foo temp("ceshi"); v.push_back(std::move(temp)); // push_back(T &&), 参数是右值引用 //打印结果: //constructor //move constructor }v.clear(); { TIME_INTERVAL_SCOPE("push_back(T&&):"); v.push_back(Foo("ceshi")); // push_back(T &&), 参数是右值引用 //打印结果: //constructor //move constructor }v.clear(); { std::string temp = "ceshi"; TIME_INTERVAL_SCOPE("push_back(string):"); v.push_back(temp); // push_back(T &&), 参数是右值引用 //打印结果: //constructor //move constructor }v.clear(); { std::string temp = "ceshi"; TIME_INTERVAL_SCOPE("emplace_back(string):"); v.emplace_back(temp); // 只有一次构造函数,不调用拷贝构造函数,速度最快 //打印结果: //constructor } }

emplace_back()无法替代push_back()的例子 【emplace_back()和push_back()的对比,前者不能替代后者的例子】emplace_back()和push_back()的对比,前者不能替代后者的例子
文章图片

    推荐阅读