225 votes

Quel est le but de std::make_pair par rapport au constructeur de std::pair?

Quel est l'objectif de std::make_pair?

Pourquoi ne pas simplement faire std::pair(0, 'a')?

Y a-t-il une différence entre les deux méthodes?

7 votes

En C++11, vous pouvez presque entièrement vous passer de make_pair. Voir ma réponse.

4 votes

En C++17, std::make_pair est redondant. Il y a une réponse ci-dessous qui détaille cela.

1 votes

En résumé : il suffit d'utiliser des accolades. ;) { 0, 'a' } (Toute personne ayant déjà codé en JavaScript appréciera particulièrement cela.)

5voto

EmpZoooli Points 21

Make_pair crée une copie supplémentaire par rapport au constructeur direct. Je typedef toujours mes paires pour fournir une syntaxe simple.
Cela montre la différence (exemple de Rampal Chaudhary) :

class Sample
{
    static int _noOfObjects;

    int _objectNo;
public:
    Sample() :
        _objectNo( _noOfObjects++ )
    {
        std::cout<<"À l'intérieur du constructeur par défaut de l'objet "<<_objectNo< map;

    map.insert( std::make_pair( 1, sample) );
    //map.insert( std::pair( 1, sample) );
    return 0;
}

4 votes

Je suis assez sûr que la copie supplémentaire sera omise dans tous les cas, si les paramètres d'optimisation du compilateur sont suffisamment élevés.

1 votes

Pourquoi voudriez-vous jamais compter sur les optimisations du compilateur pour la correction ?

0 votes

Je obtiens les mêmes résultats avec les deux versions, et avec std::move juste à l'intérieur de insert et/ou autour de ce qui serait une référence à sample. Ce n'est que lorsque je change std::map en std::map que je réduis le nombre d'objets construits, et seulement lorsque je supprime le constructeur de copie que j'élimine toutes les copies (évidemment). Après avoir apporté ces deux modifications, mon résultat comprend un appel au constructeur par défaut et deux appels au destructeur pour le même objet. Je pense que je dois manquer quelque chose. (g++ 5.4.1, c++11)

2voto

Mahmoud Badri Points 447

À partir de c++11, utilisez simplement une initialisation uniforme pour les paires. Donc au lieu de :

std::make_pair(1, 2);

ou

std::pair(1, 2);

utilisez simplement

{1, 2};

2 votes

{1, 2} peut être utilisé pour initialiser une paire, mais ne s'engage pas pour le type paire. C'est-à-dire que lorsque vous utilisez auto, vous devez vous engager à un type du côté droit : auto p = std::pair{"Tokyo"s, 9.00};.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X