2017-08-21 4 views
1

J'ai lu sur les différents conteneurs dans la bibliothèque standard C++, et je continue à entendre sur la façon dont le vecteur simple dans la pratique surpassera souvent la plupart des autres conteneurs lors de l'itération sur les éléments. On dit que cela est dû à la cohérence du cache (tous stockés dans la mémoire contiguë), au lieu de sauter d'un endroit à l'autre dans un arbre binaire ou une liste chaînée. Mais je pensais, si nous parlons d'un vecteur de pointeurs ou de références à des objets par opposition aux objets eux-mêmes, itérer sur le vecteur impliquera une déréférence à chaque itération, où l'objet est situé dans une zone séparée de la mémoire. Dans ce cas, je ne vois pas mieux que de sauter d'un lien vers un lien dans une liste ou un arbre. La façon dont je le vois est comme suit, et chacun fait à peu près la même chose pour autant que je puisse voir.Aucun avantage pour le vecteur mémoire contigu lorsque les éléments sont des pointeurs ou des références?

enter image description here

Si cela est vrai, alors je peux supposer que chaque fois que les gens prétendent que le vecteur est plus convivial qui cache c'est seulement le cas lorsque le stockage d'objets, et non des pointeurs ou des références à des objets? En outre, je ne suppose pas que si les pointeurs seraient à un type polymorphique ferait une différence entre les deux?

+4

Même pour un 'vECTOR' de pointeurs, vous avez encore besoin de lire les valeurs de ces pointeurs vers déréférencer leur. Obtenir ces adresses sera toujours plus sensible au cache avec un 'vecteur' qu'avec une liste. –

+2

Le vecteur est plus facile à mettre en cache qu'une liste si le vecteur et la liste stockent le même type de données, ce qui n'est pas le cas dans votre illustration. Vous devez comparer comme avec. –

+0

"Dans ce cas, je ne vois pas mieux que de sauter d'un lien vers un lien dans une liste ou un arbre" car accéder aux pointeurs stockés dans une liste ou un arbre est toujours moins efficace que s'ils étaient stockés dans un vecteur . Le déréférencement des pointeurs vient s'ajouter à cela et peu importe d'où vient le pointeur – user463035818

Répondre

1
|ptr1|ptr2|ptr3|ptr4|  //vector 

et

|ptr1|--->|ptr2|--->|ptr3|--->|ptr4| //list 

considèrent maintenant accéder au troisième objet via ptr3.

Temps pris par le vecteur.

O(1) time to reach ptr3 + time to dereference ptr3 

temps pris par la liste

O(2) time to reach ptr3 + time to dereference ptr3. 

Donc, la différence est d'atteindre le pointeur déréférencé.

En général l'accès à un élément sur un vector est O (1), tandis que dans un list est O (n)

+0

Ouais j'étais au courant de tout l'accès aléatoire. Mais comme Neil Butterworth a souligné que mon diagramme ne montre même pas une comparaison équitable, comme le vecteur est le vecteur de type et la liste est de type liste . – Zebrafish