No encontré a nadie respondiendo esto, ¿hay alguna diferencia entre lo siguiente?

v.push_back({x, y});

Y:

v.push_back(make_pair(x, y));

Suponiendo que v fue declarada de esta manera:

vector<pair<int,int> > v;
3
Noueman Khalikine 8 sep. 2018 a las 17:24

3 respuestas

La mejor respuesta

Intenté esto en un compilador en línea, y hasta donde puedo ver, el ensamblaje optimizado para make_pair es idéntico a la sintaxis {}.

https://godbolt.org/z/P7Ugkt

4
Hitobat 8 sep. 2018 a las 15:24

{x, y} en v.push_back({x, y}) es inicialización agregada (desde C ++ 11 ) de v 's value_type, mientras que std::make_pair es una función que crea y std::pair con tipos deducidos de sus argumentos.

Una ventaja de push_back({x, y}) sobre emplace_back(x, y) es que puedes mantener pequeñas estructuras simples (sin constructores) como esta:

#include <vector>

struct A {
    int x;
    int y;
    // A(int _x, int _y) : x{_x}, y{_y} {}
};

int f()
{
    std::vector<A> v;
    v.push_back({1, 2});
    // v.emplace_back(1, 2); // doesn't compile unless constructor is uncommented
}

Ejemplo.

2
Dev Null 26 dic. 2018 a las 00:19

Creo que puede haber aceptado esa respuesta demasiado rápido. La forma comúnmente aceptada de hacer esto es así:

vec.emplace_back (x, y);

Y si nos fijamos en Godbolt, puede ver que esto alinea todo (que puede o no ser lo que desea):

https://godbolt.org/z/aCl02d

Ejecútalo en Wandbox:

https://wandbox.org/permlink/uo3OqlS2X4s5YpB6

Código:

#include <vector>
#include <iostream>

int x = 1;
int y = 2;
std::vector<std::pair<int,int>> vec;

int main () {
    vec.push_back(std::make_pair(x, y));
    std::cout << "make_pair done\n";
    vec.push_back({x, y});
    std::cout << "push_back done\n";
    vec.emplace_back (x, y);
    std::cout << "emplace_back done\n";

    for (std::pair <int, int> p : vec)
    {
        std::cout << p.first << ", " << p.second << "\n";
    }
}

Salida:

make_pair done
push_back done
emplace_back done
1, 2
1, 2
1, 2

Por supuesto, todo funciona más rápido si reserva la cantidad adecuada de elementos en el vector por adelantado. Tal vez eso es lo que las personas que hacen esta pregunta realmente quieren que digas.

6
Paul Sanders 26 dic. 2018 a las 11:56