L'accès aux éléments d'une liste de listes en C++
J'ai une liste de listes:
std::list<std::list<double> > list;
Je l'ai rempli avec des listes avec des doubles en eux (en fait beaucoup, c'est pourquoi je ne suis pas à l'aide d'un vecteur. Tout cela de la copie prend beaucoup de temps.)
Dire que je veux accéder à l'élément qui pourrait être accessible comme list[3][3]
si la liste n'était pas une liste mais un vecteur ou tableau à deux dimensions. Comment dois-je procéder?
Je sais que l'accès à des éléments dans une liste est accompli en utilisant un itérateur. Je ne pouvais pas comprendre comment sortir de la double si.
- Vous devez utiliser
vector
. Utilisationlist
uniquement lorsque vous avez besoin d'épissage. - si vous n'avez pas besoin d'accès aléatoire et vous avez besoin de supprimer des éléments à partir de début/milieu de conteneur à l'aide de vecteur est une très mauvaise idée.
- utilisation
vector::reserve
de réserver de la mémoire et d'éviter les copies supplémentaires si cela est de votre ressort. Aussi, même si vous pouvez obteniroperator[]
pour ce que vous voulez, ça sera vraiment inefficace. std::vector
est généralement assez intelligent quand il a besoin de réaffecter, de sorte que le plus grand il devient moins il a de réaffecter et de copie.std::list
est seulement plus rapide si vous êtes de la création du conteneur de très nombreuses fois au cours de la durée de vie du programme.- vous avez raison, si vous avez besoin d'insérer/supprimer à partir de début/milieu, vous ne devriez pas utiliser ce vecteur soit. Juste parce que vous n'avez pas besoin d'un accès aléatoire ne signifie pas que vous ne devriez pas utiliser ce vecteur de bien.
- il y a une structure de données de liste de boost qui offre à la fois les capacités de std::vector et la liste\
Vous devez vous connecter pour publier un commentaire.
À l'aide d'un vecteur d'habitude ont de bien meilleures performances, bien que l'accès à l'élément
n
d'une liste est O(n).Si vous êtes inquiet au sujet de la performance de l'épissage de l'intérieur du conteneur, vous pouvez utiliser
deque
, qui aoperator[]
, amorti constant de l'insertion et de la suppression de la fin, et le temps linéaire de l'insertion et de la suppression de l'intérieur.Pour C++03 compilateurs, vous pouvez mettre en œuvre
begin
etnext
vous-même:std::next()
ou dont itérateur est tout simplement pas assez. Il semble aussi qu'il manquestd::begin()
std::begin
ont été ajoutés en C++11.std::next
; je vais vous le montrer ci-dessus.À fait répondre à votre question, vous devriez probablement regarder
std::advance
.Strictement répondre à votre question, Joachim Pileborg de l' réponse est le chemin à parcourir:
Maintenant, à partir de votre question et d'autres commentaires, il n'est pas clair si vous avez toujours ajouter des éléments à la fin de la liste ou ils peuvent être ajoutés n'importe où. Si vous ajoutez toujours à la fin,
vector<double>
fonctionnera mieux. Unvector<T>
ne doivent pas être copiés à chaque fois sa taille augmente; seulement à chaque fois que son capacité augmente, ce qui est une chose très différente.En plus de cela, en utilisant
reserve()
, comme d'autres ont dit avant, ce sera beaucoup plus avec la redistribution. Vous n'avez pas besoin de réserver pour la taille combinée de tous les vecteurs, mais seulement pour chaque vecteur. Donc:Et vous serait également en réserve pour chaque
vector<double>
à l'intérieur dev
. C'est tout.Prendre en compte le fait que la liste de vos listes de prendre beaucoup plus d'espace. Pour chaque
double
dans la liste interne, il devra consacrer au moins deux autres pointeurs, et aussi deux des pointeurs supplémentaires pour chaque liste à l'intérieur du mondial des moins. Cela signifie que le total de la mémoire prises par votre conteneur sera environ trois fois plus que le vecteur. Et tout cela, d'attribution et de gestion prend également supplémentaire de l'exécution.advance
ne fonctionnera pas sur un temporaire tel que retourné parbegin
. Vous avez besoin d'utilisernext
.deque<>
. Il est généralement un peu plus lent quevector<>
, mais il pousse beaucoup mieux, car il n'a pas besoin de se copier lui-même. Pour cette raison,deque<>
n'a pas de méthodereserve()
.advance()
ne fonctionne pas de la manière que j'ai écrit. Je suis l'édition du code.