63 votes

Utilisation de C++ vector::insert() pour ajouter à la fin du vecteur

J'écris un petit bout de code où je dois insérer des valeurs dans un vecteur STL C++ à un certain endroit en fonction des valeurs des éléments du vecteur. J'utilise la fonction insert() pour y parvenir. Je me rends compte que lorsque je veux ajouter un nouvel élément à la fin du vecteur, je pourrais simplement utiliser la fonction push_back() . Mais pour que mon code reste agréable à lire, je voudrais utiliser exclusivement insert() qui prend en entrée l'itérateur pointant sur l'élément après le point d'insertion souhaité et la valeur à insérer. Si la valeur de l'itérateur passé en argument est v.end()v est mon vecteur, est-ce que cela fonctionnera de la même manière que push_back() ?

Merci beaucoup !

4 votes

Si vous utilisez souvent l'insertion dans un vecteur, vous utilisez peut-être la mauvaise structure de données. Considérez (par exemple) l'utilisation d'un deque. Bien sûr, si le vecteur est petit, il n'y aura aucun problème.

13 votes

Nick : Oui, c'est vrai. Une simple expérience aurait pu vous le dire.

16 votes

@Space Je ne vois pas comment une expérience aurait pu lui dire ça. Si elle n'était pas valide, il aurait eu l'UB, auquel cas son programme aurait pu sembler fonctionner.

107voto

Charles Bailey Points 244082

a.push_back(x) es défini pour avoir une sémantique identique à celle de (void)a.insert(a.end(),x) pour les conteneurs de séquences qui le prennent en charge.

Voir le tableau 68 de la norme ISO/IEC 14882:2003 23.1.1/12 [lib.sequence.reqmts].

Screenshot of Table 68 taken from International Standard ISO/IEC 14882:2003 at https://cs.nyu.edu/courses/fall11/CSCI-GA.2110-003/documents/c++2003std.pdf

En ce qui concerne le temps de fonctionnement de vector.push_back(x) vs. vector.insert(vector.end(), x) considérer la partie soulignée :

Le tableau 68 énumère les opérations de séquence qui sont fournies pour certains types de conteneurs séquentiels mais pas pour d'autres. Une implémentation doit fournir ces opérations pour tous les types de conteneurs indiqués dans la colonne ''conteneur'', et doit les implémenter de manière à prendre en charge les coûts amortis de l'opération. constant temps.

2 votes

Question rapide, en termes de performances, je me demande si pusk_back fonctionne plus rapidement ? J'ai testé quelque chose qui montre que l'insertion est un peu lente, je voulais juste être sûr... Merci

2 votes

Push_back() ne rend pas l'itérateur de l'élément nouvellement inséré. std::list<T>::end() rendra un itérateur mort.

0 votes

La réponse serait meilleure si vous incluiez la section de la norme à laquelle vous faites référence.

17voto

neuront Points 1384

Il y a une légère différence que push_back renvoie à void si insert renvoie à iterator à l'élément qui vient d'être inséré.

Au fait, il existe un autre moyen de vérifier s'ils font la même chose : compilez les codes suivants

int main()
{
    std::vector<int const> v;
    v.push_back(0);
    return 0;
}

le compilateur imprimera un tas de messages ennuyeux, lisez simplement et vous trouverez push_back appelle insert (si ce n'est pas le cas, essayez de compiler v.insert(v.end(), 0) pour voir s'ils appellent la même fonction d'insertion) à la fin.

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