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?
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?
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;
}
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.
Pourquoi voudriez-vous jamais compter sur les optimisations du compilateur pour la correction ?
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)
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.
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.)1 votes
std::make_pair(vec.cbegin(), vec.cend())
par rapport àstd::pair::const_iterator, std::vector::const_iterator>(vec.cbegin(), vec.cend())
?