emplace_back() es una nueva característica de c++11.
La diferencia con push_back () es que
el método push_back () llama al constructor y al constructor de copia, lo que significa que primero se debe construir un objeto temporal y luego el constructor de copia temporal se debe copiar o mover al final del contenedor.
Cuando se implementa emplace_back(), el elemento se crea directamente al final del contenedor, eliminando el proceso de copiar o mover el elemento.
vector<pair<int, int>> ret;
ret.push_back(1,1)//会报错,因为没有构造一个临时对象
ret.push_back(pair(1,1))//不会报错,因为构成了一个pair对象
ret.emplace_back(1,1)//不会报错,因为直接在容器的尾部创建对象
Nuevas características de C++ 11, por qué se recomienda usar emplace_back() para reemplazar push_back()
C++ 11 ha agregado recientemente emplace_back() para reemplazar push_back():
En tiempos normales, estamos acostumbrados a usar push_back() para completar la inserción final, pero si es un objeto temporal, push_back() necesita construir el objeto temporal primero y luego copiar el objeto al final del contenedor, mientras que emplace_back () directamente El objeto se construye al final del contenedor, eliminando así el proceso de copia.
Analiza el siguiente código:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int i=0,j=0;
class A {
public:
A(int i){
string str = to_string(i);
cout << "构造函数" <<++i<< endl;
}
~A(){
}
A(const A& a): str(a.str){
cout << "拷贝构造" <<++j<< endl;
}
public:
string str;
};
int main(){
vector<A> vec;
vec.reserve(10);//开辟capacity
for(int i=0;i<10;i++){
vec.push_back(i); //调用了10次构造函数和10次拷贝构造函数,
// vec.emplace_back(i); //调用了10次构造函数一次拷贝构造函数都没有调用过
}
}
Producción:
Después de usar .emplace_back()