La plupart des réponses omettent un détail important : pour quoi faire ?
Que voulez-vous garder dans le conteneur ?
S'il s'agit d'une collection de int
s, alors std::list
perdront dans tous les scénarios, peu importe que vous puissiez réaffecter, que vous ne retiriez que du front, etc. Les listes sont plus lentes à parcourir, chaque insertion vous coûte une interaction avec l'allocateur. Il serait extrêmement difficile de préparer un exemple dans lequel list<int>
battements vector<int>
. Et même là, deque<int>
peut être meilleure ou proche, sans se contenter de l'utilisation de listes, qui auront une plus grande surcharge de mémoire.
Cependant, si vous avez affaire à des données volumineuses et peu nombreuses, que vous ne voulez pas surallouer lors de l'insertion, et que la copie due à la réallocation serait un désastre, alors il est peut-être préférable d'utiliser une méthode d'allocation de données. list<UglyBlob>
que vector<UglyBlob>
.
Pourtant, si vous passez à vector<UglyBlob*>
ou même vector<shared_ptr<UglyBlob> >
Encore une fois, la liste sera à la traîne.
Ainsi, le modèle d'accès, le nombre d'éléments cibles, etc. influencent toujours la comparaison, mais à mon avis, la taille des éléments, le coût de la copie, etc.
7 votes
Bien que ce ne soit pas ce que vous avez demandé, il est utile de souligner que le choix par défaut du vecteur signifie également que vous pouvez facilement interagir avec du code plus ancien, des bibliothèques C ou des bibliothèques non modélisées, puisque le vecteur est une enveloppe mince autour du tableau dynamique "traditionnel" d'un pointeur et d'une taille.
21 votes
Bjarne Strostrup a réalisé un test dans lequel il a généré des nombres aléatoires, puis les a ajoutés respectivement à une liste et à un vecteur. Les insertions étaient faites de manière à ce que la liste/le vecteur soit toujours ordonné(e). Même s'il s'agit typiquement d'un "domaine de liste", le vecteur a surpassé la liste par une LARGE marge. La raison en est que l'accès à la mémoire est lent et que la mise en cache fonctionne mieux pour les données séquentielles. Tout cela est disponible dans sa présentation de "GoingNative 2012".
5 votes
baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque
1 votes
Si vous voulez voir le discours de Bjarne Stroustrup mentionné par @evading, je l'ai trouvé ici : youtu.be/OB-bdWKwXsU?t=2672