2017-09-19 5 views
1

J'ai un vecteur d'entiers, et j'ai besoin de beaucoup de déplacements, de hachages et de changements sur cette liste. Mais ... Je vais principalement besoin d'accéder à ces éléments par leur valeur.Accéder aux éléments de la liste chaînée à partir d'un vecteur de références à ces éléments

Donc ce que j'ai concocté est une idée d'utiliser une liste std :: list (double-linked-list) qui facilitera les opérations de ré-ordonnancement. Ensuite, pour créer également un vecteur indexé par les valeurs entières, où les valeurs sont des vecteurs de références aux éléments std :: list. De cette façon, je n'ai pas à parcourir toute la liste chaînée pour trouver une valeur particulière dans la liste, car j'aurai ces petits vecteurs de références.

Je n'arrive pas à comprendre comment configurer cela.

Voici un échantillon de ce que j'ai essayé de faire:

vector<int> original = { 1, 1, 0, 2, 1, 3, 1, 0 }; 
vector<vector<int*>> byNumber(4); 
list<int> linkedList; 
for (int i = 0; i < original.size(); ++i) { 
    linkedList.push_back(original[i]); 
    byNumber[original[i]].push_back(*linkedList[i]); 
} 

Repousser les articles « originaux » dans la liste chaînée est assez facile, mais la création puis la référence en byNumber est où je suis coincé sur. J'ai essayé de pousser &(*linkedList[i]) aussi. Je ne suis pas clair sur la syntaxe que je peux utiliser pour le faire, et si ce sera même possible. J'ai aussi essayé unique_ptr au lieu de int * que je peux changer si cela est trop problématique.

+1

'int *' n'est pas une référence à un élément de liste. Vous voudrez peut-être stocker * itérateurs *. –

Répondre

0

ici:

vector<vector<int*>> byNumber(4); 

vous stockez des pointeurs, pas de références. Vous pouvez le faire, en faisant ceci:

vector<vector<int&>> byNumber(4); 

Mais pourquoi ne pas stocker itérateurs, comme ceci:

vector<vector<vector<int>::iterator>> byNumber(4); 
+0

Vous avez raison, je me suis trompé. Merci d'avoir fait remarquer cela. La ligne sur laquelle j'ai vraiment besoin de conseils est: byNumber [original [i]]. Push_back (??); et pouvez-vous élaborer sur l'idée de l'itérateur? Par exemple, quels sont les avantages par rapport aux références, et connaissez-vous les différences de performance? – braks

+1

@braks Je pense que je suis confus par votre conception, désolé! – gsamaras

+0

Oh d'accord :(Merci d'avoir essayé. – braks

1

D'après les conseils d'utiliser un itérateur je suis venu avec cela. Mais si quelqu'un a une solution plus serrée j'aimerais l'entendre.

vector<int> original = { 1, 1, 0, 2, 1, 3, 1, 0 }; 
vector<vector<list<int>::iterator>> byNumber(4); 
list<int> linkedList; 
list<int>::iterator it; 
for (int i = 0; i < original.size(); ++i) { 
    linkedList.push_back(original[i]); 
    it = linkedList.begin(); 
    advance(it, i); 
    byNumber[original[i]].push_back(it); 
}