C++11: vector::push_back和vector::emplace_back的区别
程序员文章站
2022-03-21 14:28:48
...
vector::push_back()的输入参数是对象本身;
vector::emplace_back()的输入参数是构造函数的参数args,它可以根据这些参数构造一个对象。
emplace_back()有个好处,它是调用带有args的allocator_traits :: construct来“就地(in-place)构造”,防止了“先调用constructor构造对象,然后调用copy-constructor再构造一次”的性能损失。
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
explicit A(int x):x_(x){
cout << "A(int)" << endl;
}
A(const A&){
cout << "A(const A&)" << endl;
}
private:
int x_;
};
int main(){
vector<A> vec;
vec.reserve(10); // 防止vector容量变化导致的再分配
vec.push_back(A(10)); // correct!先调用A(int),再调用A(const int&),有两次构造
// vec.push_back(10); // error: no matching function for call to ‘std::vector<A>::push_back(int)’
vec.emplace_back(A(10)); // correct!先调用A(int),再调用A(const int&),有两次构造
vec.emplace_back(20); // correct!直接调用A(int),只有一次构造
return 0;
}
推荐阅读
-
vector和arraylist的区别面试题(教你保证多线程顺序执行)
-
详解C++ STL vector容量(capacity)和大小(size)的区别
-
65、ArrayList和Vector的区别,HashMap和Hashtable的区别
-
Java中Vector和ArrayList的区别
-
Java中Vector和ArrayList的区别
-
详解C++ STL vector容量(capacity)和大小(size)的区别
-
vector和arraylist的区别面试题(教你保证多线程顺序执行)
-
关于c++中vector的push_back、拷贝构造copy constructor和移动构造move constructor
-
Leetcode——844.比较含退格的字符串——题解+代码实现(使用vector的push_back和pop_back)
-
C++ std::vector 的 emplace_back 能否完全取代 push_back