2017-09-19 1 views
1

Ich habe einen Vektor von Ganzzahlen, und ich muss eine Menge bewegen, hacken und ändern auf dieser Liste durchführen. Aber ... Ich werde in erster Linie auf diese Gegenstände zugreifen müssen, was ihr Wert ist.Zugriff verknüpfte Listenelemente aus einem Vektor von Verweisen auf diese Elemente

Also was ich mir ausgedacht habe, ist eine Idee, eine std :: list (double-linked-list) zu verwenden, die die Nachbestellvorgänge erleichtert. Erstellen Sie dann auch einen Vektor, der durch Integer-Werte indiziert wird, wobei die Werte Vektoren von Referenzen auf die std :: list-Elemente sind. Auf diese Weise muss ich nicht die gesamte verknüpfte Liste durchlaufen, um einen bestimmten Wert in der Liste zu finden, da ich diese kleineren Referenzvektoren haben werde.

Ich kann nicht herausfinden, wie Sie dies einrichten. Hier

ist ein Beispiel dessen, was ich versucht habe zu tun:

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]); 
} 

Pushing die ‚Original‘ Elemente in die LinkedList leicht genug, aber dann die Erstellung der Referenz in byNumber ist, wo ich bin stecken auf. Ich habe versucht, auch &(*linkedList[i]) drängen. Ich weiß nicht genau, mit welcher Syntax ich das machen kann und ob es überhaupt möglich ist. Ich habe mich auch mit unique_ptr anstelle von int * beschäftigt, zu dem ich möglicherweise zurückwechsle, wenn das zu problematisch ist.

+1

'int *' ist keine Referenz auf ein Listenelement. Vielleicht möchten Sie * Iteratoren * speichern. –

Antwort

0

hier:

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

Sie Zeiger speichern, keine Referenzen. Sie könnten das tun, indem Sie dies tun:

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

Aber warum Iteratoren nicht speichern, wie folgt aus:

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

Sie haben Recht, ich habe mich verwirrt. Danke, dass du darauf hingewiesen hast. Die eigentliche Zeile, über die ich wirklich Rat brauche, lautet: byNumber [original [i]]. Push_back (??); und können Sie die Iterator-Idee näher erläutern? Zum Beispiel, was sind die Vorteile gegenüber Referenzen, und kennen Sie die Leistungsunterschiede? – braks

+1

@Braks Ich glaube, ich bin verwirrt von Ihrem Design, sorry! – gsamaras

+0

Oh okay :(Danke für den Versuch. – braks

1

Basierend auf den Rat einen Iterator zu verwenden, ich kam mit dieser. Aber wenn jemand eine engere Lösung hat, würde ich es gerne hören.

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); 
} 
Verwandte Themen