Sont le vecteur d'un cas particulier de listes liées?
Quand on parle de la STL, j'ai plusieurs camarades de classe m'indiquant que "les vecteurs sont liés listes".
J'en ai une autre en arguant que si vous appelez la méthode effacer() avec un itérateur, il rompt le vecteur, puisque c'est une liste liée.
Ils ont aussi tendance à ne pas comprendre pourquoi je suis toujours en argumentant que le vecteur sont contigus, comme n'importe quel autre tableau, et ne semblent pas comprendre ce que l'accès aléatoire moyen. Vecteur strictement contigus comme des tableaux, ou tout simplement à la plupart des contigus ? (pour l'exemple on va allouer plusieurs segments contigus si l'ensemble du tableau ne correspondent pas).
Vous devez vous connecter pour publier un commentaire.
Je suis désolé de dire que vos camarades de classe sont complètement faux. Si vos camarades de classe peut honnêtement dire que "les vecteurs sont liés listes", alors vous devez respectueusement leur dire qu'ils doivent ramasser une bonne C++ livre (ou de tout ordinateur décent livre scientifique) et de le lire. Ou peut-être même les articles de Wikipédia pour vecteurs et listes. (Voir aussi les articles pour les tableaux dynamiques et les listes liées.)
Vecteurs (comme dans
std::vector
) ne sont pas les listes chaînées. (Notez questd::vector
ne dérivent pas destd::list
). Alors que les deux peuvent stocker une collection de données, comment un vecteur de fait, c'est complètement différent de la façon dont une liste liée t-il. Par conséquent, ils ont des caractéristiques de performance différentes dans des situations différentes.Par exemple, les insertions sont une constante de temps de fonctionnement sur les listes liées, alors qu'il est linéaire en temps de l'opération sur les vecteurs si elle est insérée dans un endroit autre que la fin. (Toutefois, il est amorti constante de temps si vous insérer, à la fin d'un vecteur.)
La
std::vector
classe en C++ sont nécessaire être contiguës par la norme C++:De la comparer à
std::list
:Clairement, le C++ standard stipule qu'un vecteur et une liste de deux récipients différents que de faire les choses différemment.
Vous ne pouvez pas "casser" un vecteur de (au moins pas intentionnellement) en appelant simplement
erase()
avec une pièce d'itérateur. Que feraitstd::vector
s plutôt inutile puisque le but de son existence est de gérer la mémoire pour vous!erase
invalidera les itérateurs d'éléments au-delà de la effacées point (et "fin").erase()
va invalider des itérateurs, mais il ne va pas se casser ou d'endommager le vecteur lui-même. Je m'adressais à la réclamation queerase()
va "casser le vecteur, puisque c'est une liste chaînée," ce qui est absurde.vector
tiendra tous de son stockage dans un seul endroit. Unvector
n'est pas même à distance comme une liste chaînée. En effet, si je devais choisir deux structures de données qui ont été les plus dissemblables les uns les autres, il seraitvector
etlist
. "Au plus contiguë" est de savoir comment undeque
fonctionne.Vecteur:
Liste:
Comme vous pouvez le voir, ils se comportent différemment dans chaque structure de données de cas d'utilisation.
Par définition,
vector
s sont des blocs de mémoire contigus comme C des tableaux. Voir: http://en.wikipedia.org/wiki/Vector_(C%2B%2B)Vecteurs ne sont pas liées liste, ils fournissent l'accès aléatoire et sont contigus, comme des tableaux. Afin d'atteindre cet objectif, ils ré-allouer de la mémoire sous le capot.
Liste est conçu pour permettre une insertion rapide et de suppressions, tout n'est pas d'invalider toutes les références ou les itérateurs à l'exception de
ceux de l'élément supprimé.