3
votes

emplace_back ne crée pas d'objet inplace

constructor called
Move constructor called

1 commentaires

Vous créez vous-même l'objet avec test () . Supprimez ça.


3 Réponses :


3
votes

emplace_back ne le fait pas construire des temporaires, mais vous avez construit un objet temporaire explicitement par test () , puis le nouvel élément est ajouté au vecteur à partir du temporaire par le constructeur de déplacement.

Vous peut juste

vec.emplace_back();


2 commentaires

Merci mon pote! ..Je l'ai. Mais si je veux ajouter un objet de test qui a déjà été créé avant emplace_back, alors emplace_back fonctionnera-t-il comme push_back ?? Si oui, quand dois-je utiliser emplace_back ?? seulement quand je connais les arguments du constructeur?


@bajirao Oui et oui. Si vous possédez déjà l'objet, emplace_back et push_back fonctionnent de la même manière. Si vous connaissez les arguments acceptés par le constructeur de la classe et que vous ne souhaitez pas construire l'objet temporaire, vous pouvez utiliser emplace_back , qui construirait l'élément sur place.



1
votes

Avec emplace_back (test ()) , vous avez déjà créé un objet en dehors de emplace_back et il a un constructeur de déplacement donc il est construit par déplacement. Vous devriez donc l'appeler sans aucun argument pour ce cas. Ensuite, vous ne verrez aucun appel de constructeur de copie / déplacement.

vec.emplace_back(1, 2);
vec.emplace_back("abcd");

Pour mieux comprendre, si votre classe test a plus de constructeurs, vous pouvez donner emplace_back avec ces constructeurs. Par exemple,

class test {
  ...
  test(int a, int b);
  test(const char* c);
};

Et vous pouvez le faire.

vec.emplace_back(); // Will create a test object with constructor `test()` internally

Cela ne crée pas d'objet redondant, ce qui n'est pas possible avec push_back.


3 commentaires

Merci Hanjoung! ..Je l'ai. Mais si je veux ajouter un objet de test qui a déjà été créé avant emplace_back, alors emplace_back fonctionnera-t-il comme push_back ?? Si oui, quand dois-je utiliser emplace_back ?? seulement quand je connais les arguments du constructeur?


@bajirao Oui. Dans ce cas, les deux fonctionnent de la même manière. Je pense qu'il est toujours bon d'utiliser emplace_back tant que vous utilisez C ++ 11 ou version ultérieure. Mais encore push_back est nécessaire pour la compatibilité du code hérité.


IMHO emplace_back a été introduit à partir de C ++ 11 car il nécessite des modèles variadiques.



1
votes

Avec emplace_back , la méthode sait déjà quel type de classe vous ajoutez à votre vecteur (vous le nommez lors de l'initialisation du vecteur), donc les arguments d'entrée pour emplace_back code > est uniquement les arguments pour le constructeur que vous voulez appeler (généralement vous voulez éviter le constructeur de copie, dont l'argument est un objet de la même classe):

struct A
{
    A (int a, int b, int c)
    {
    // do something
    }

    A (const A & other)
    {
    //do something else
    }
};

std::vector<A> array;

array . emplace_back (1, 2, 3);
// the above finds the constructor with these input arguments
// makes the new object within the vector - no copy

A obj (4, 5, 6);

array . emplace_back ( obj );
// the above looks for the constructor with this object (A)
// it finds a constructor (the copy constructor) and copies

array . emplace_back ( A (1,2,3) );
// the above first processes the inner part: making a new A object
// then searches for a constructor with that argument (an object A)
// in this case that's the copy constructor
Dans votre cas, vous vouliez appeler un constructeur sans arguments. C'est pourquoi vous souhaitez utiliser emplace_back () sans argument pour utiliser correctement cette méthode vectorielle.


0 commentaires