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()
où 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.
1 votes
@unapersson : Un deque n'aiderait que si la majorité des insertions est au début ou à la fin de la séquence. Si c'est seulement à la fin de la séquence, un vecteur fera tout aussi bien l'affaire.
0 votes
Vous utilisez insert() pour avoir un code agréable à lire ? Vous devriez vous habituer aux parties "pas belles" en C++/STL et coder de manière efficace et lisible.
0 votes
@Space Un deque est meilleur (ou aussi bon) pour les insertions à n'importe quelle position, ce qui est ce que le PO semble faire.
5 votes
@unapersson Un deque est meilleur pour les insertions au début. C'est presque certainement pire (les deux sont linéaires, mais la deque aura un facteur constant beaucoup plus important) pour les insertions n'importe où sauf au début ou à la fin. Et le coût de l'insertion au milieu d'un vecteur a souvent été surestimé, du moins si les types du vecteur sont des types POD. (Le véritable "coût" de l'insertion est souvent qu'elle invalide les itérateurs. Seul
std::list
évite cela, maisstd::list
est extrêmement coûteux autrement).