本文通过测试和走读 std::vector::emplace_back 源码,理解 C++11 引入的 emplace 新特性。 文章来源:[stl 源码分析] 浅析 std::vector::emplace_back 原理相对简单:emplace_back 函数的参数类型是可变数量的 万能引用,参数通过 完美转发 到std::vector 内部进行对象创建构造,可以有效减少参数传递过程中产生临时对象...
emplace_back emplace_back是C++11引入的新函数,它可以通过传递容器元素的构造函数所需的参数,从而直接在容器尾部构造元素,而不需要调用拷贝构造函数。这使得它在性能上比push_back更高效,尤其是当元素是临时对象或具有移动语义时。 代码语言:javascript 复制 std::vector<int>vec;vec.emplace_back(42);// 在容器中...
有些时候,当我们在使用vector容器的时候,总会需要使用push_back或者emplace_back来加入元素。这个时候会有人提出,emplace_back是C++11之后添加的方法,性能会优于push_back,应当优先选择emplace_back这种说法;异或是emplace_back是原地构造,push_back会先临时构造临时变量,复制过来后,再通过临时变量构造元素等等说法。
// Implementation of emplace() function #include<iostream> #include<vector> usingnamespacestd; intmain() { vector<int>myvector; myvector.emplace_back(1); myvector.emplace_back(2); myvector.emplace_back(3); myvector.emplace_back(4); myvector.emplace_back(5); myvector.emplace_back(6); ...
}voidtestPushBack(){vector<int> arr;for(inti =0; i < N; i++){ arr.push_back(i); } }voidtestEmplaceBack(){vector<int> arr;for(inti =0; i < N; i++){ arr.emplace_back(i); } }voidtestReserveWithPush(){vector<int> arr; ...
在vector里,push_back和emplace_back都是向容器尾部添加新元素。 从用法来说,都是一样的。但是 emplace_back是c++11新增的,有些竞赛的评测机很可能不支持。 而emplace_back的实现是比push_back要好的,push_back本质上是又创建了一个新元素再拷贝到尾部,而emplace_back是直接在尾部创建,省去了送入元素的过程。
C++ STL中的vector容器在添加元素时,通常我们使用push_back或emplace_back。有人认为emplace_back是C++11后引入的,性能优于push_back,因此推荐使用。但实际上,两者在性能和兼容性上的差异并不显著。尽管emplace_back引入了原地构造的概念,但其本质是通过右值引用接收元素。push_back也有一个右值引用的...
从源代码中可以看出,两者只有参数得区别,push_back参数为左值引用和右值引用,而emplace_back是一个参数包_Valty&&…,你可以向这个参数包传构造对象得参数即可。 实例分析: classA {public:inti; A(intt) :i(t) {cout<<"A()"<<endl; } A(constA&a) :i(a.i) {cout<<"拷贝构造"<<endl; } A( ...
在实际应用中,常用 emplace()、emplace_front() 和 emplace_back() 分别代替 insert()、push_front() 和 push_back(),具体原因本节后续会讲。 以上这些成员函数中,除了 insert() 函数的语法格式比较多,其他函数都只有一种用法(erase() 有 2 种语法格式),下面这段程序演示了它们的具体用法: ...
在上面的例子中,我们使用std::pair<int, std::string>作为元素类型,使用emplace_back在vector结尾插入多个元素。第一个参数是int类型,第二个参数是std::string类型。 由于emplace_back不执行额外的拷贝构造或移动构造,因此它比push_back更快。由于它将构造函数参数传递给插入的对象,因此不允许传递到插入的对象的const...