Je peux comprendre quand utiliser des listes, mais je ne comprends pas quand il vaut mieux utiliser des vecteurs que d'utiliser des listes dans les jeux vidéo: quand est-il préférable d'avoir un accès aléatoire rapide?
(Et je comprends pourquoi il est plus rapide d'insérer / supprimer dans les listes car il supprime / ajoute simplement des pointeurs, mais il doit toujours trouver l'élément correspondant ...)
c++
algorithm
data-structure
jokoon
la source
la source
container
.Réponses:
Ma règle d'or, et je suis sûr qu'il y aura un débat à ce sujet, est de ne jamais utiliser de listes (sauf si vous devez supprimer très, très fréquemment des choses du milieu de grandes listes).
La vitesse que vous gagnerez en ayant tous vos éléments dans votre conteneur dans une mémoire contiguë (et donc plus compatible avec le cache) vaut la compensation des coûts supplémentaires d'ajout / suppression / redimensionnement du vecteur.
Edit: Juste pour clarifier un peu plus, bien sûr, il va sans dire que toute sorte de question "qui est plus rapide" devrait être testée sur n'importe quelle plate-forme avec tous les ensembles de données correspondant à vos besoins particuliers. Si j'ai juste besoin d'une collection d'éléments, j'utilise simplement vector (ou deque, ce qui est presque la même chose) à moins qu'il n'y ait une bonne raison de ne pas le faire.
la source
Utilisez une liste lorsque l'invalidation de l'itérateur causée par la modification du milieu de votre structure de données va causer un problème, ou si vous devez conserver vos éléments triés afin que le swap et le pop pop pour les suppressions rapides de la collection du milieu ne fonctionnent pas et que vous ayez un grand nombre de suppressions de milieu de collection.
Vous pouvez également envisager d'utiliser un Deque. Il a des caractéristiques de performances similaires à un vecteur mais n'a pas besoin de mémoire contiguë pour le vecteur et est un peu plus flexible.
la source
Votre choix doit refléter vos besoins. Tous les éléments des vecteurs sont continus en mémoire et les listes ont des pointeurs vers les éléments suivants / précédents afin qu'ils aient chacun leurs avantages / désavantages:
Listes :
Vecteurs:
La liste est donc meilleure lorsque votre programme doit ajouter et supprimer des éléments fréquemment, mais jamais accéder (ou rarement accéder) à un élément particulier sans avoir besoin des autres auparavant. Le vecteur doit être utilisé pour un meilleur temps d'accès, mais manque d'efficacité lorsque vous devez supprimer ou ajouter des éléments.
Consultez cet article sur stackoverflow, il présente un très joli graphique avec des questions de base sur vos besoins qui vous conduit à un conteneur spécifique en fonction de vos réponses:
/programming/366432/extending-stdlist
la source
Habituellement, les listes sont utilisées pour les structures comme les files d'attente où il y a beaucoup d'opérations d'ajout et de suppression. Exemple: une liste d'entités en constante évolution qui doit être mise à jour. La liste elle-même ne contient que des entités à l'écran et change donc fréquemment.
Les vecteurs (ou tableaux) sont mieux adaptés à une collection qui ne change pas beaucoup et où vous avez besoin d'un accès rapide aux éléments individuels de la collection. Exemple: une tuile-carte où vous devez rechercher des tuiles à un index donné.
L'opinion de Tetrads est peut-être vraie, mais elle dépend du langage de programmation utilisé. Je vois que vous avez marqué votre question
c++
, mais j'ai essayé de donner une réponse qui n'est pas spécifique à la langue.la source
Dans les jeux sur console, nous n'utilisons jamais std :: list car:
même std :: vector perd la faveur des consoles car:
la source
struct point{float x, y, z, w}; std::vector<point> positions;
point
est un objet C ++ (tel quelstd::vector
, comme c'est quelque chose d'aussi simple quefloat
). Je connais la distinction que vous essayez de faire, mais vous expliquez mal.