Se recomienda utilizar emplace_back() para reemplazar push_back()

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:
Insertar descripción de la imagen aquí

Después de usar .emplace_back()Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xiaojinger_123/article/details/128705779
Recomendado
Clasificación