2016-08-03 9 views
-1

Wie überprüfe ich, ob ein Index in einem Vektor bereits verwendet wird?
Ich möchte etwas wie folgt aus:Wie überprüft man, ob ein Index in einem Vektor bereits verwendet wird?

if(isUsed(vector,index)) 
    do something 
else 
    do something else 

Beispiel:

std::vector<int> myVector; 
myVector[0] = 5; 
myVector[2] = 0; 
myVector[3] = 1; 

myVector.erase(3); 

isUsed(myVector,3) = false 
isUsed(myVector,1) = false 
isUsed(myVector,2) = true 
isUsed(myVector,5) = false 
isUsed(myVector,0) = true 

oder:

std::map<int,std::string> myMap; 
myMap[1] = "x"; 

myMap.count(1) > 0 = true 
myMap.count(0) > 0 = false 

ich diese Funktion wollen schnell sein, weil im mit viel Indizes arbeiten.

+2

Verwenden 'boost :: optional' –

+2

Wie definieren Sie„verwendet“? Alle gültigen Indizes ('0' bis' size (-1)) haben gültige Elemente. – juanchopanza

+2

Sind Sie sicher, dass 'vector' die richtige Datenstruktur ist, wenn Sie dies tun müssen? – Barmar

Antwort

1

können Sie einen std::unordered_map versuchen, funktioniert es wie eine Karte, ist aber viel schneller für die meisten Operationen

std::unordered_map<int,std::string> myMap; 
myMap[1] = "w"; 

myMap.count(1) > 0 == true 
myMap.count(0) > 0 == false 
0

Obwohl die Verwendung boost :: optional korrekt klingt es wie sie, wie etwas fragen könnte std::map<int, Object>

0

Verwenden assoziatives Array aka std::map:

std::map<size_t,int> myVector; 
myVector[0] = 5; 
myVector[2] = 0; 
myVector[3] = 1; 

myVector.erase(3); 

und Ihre isUsed() wird gleich:

myVector.count(3) 

Sie können es in Funktion umwandeln, wenn Sie möchten:

Wenn Sie nicht auf die Reihenfolge achten, die Sie über Ihren Container durchlaufen, können Sie statt dessen std::unordered_map verwenden, was schneller ist, aber die Reihenfolge der Elemente in Iteration würde ziemlich zufällig sein.

0

Sie könnten genau die gleiche Logik verwenden, die Sie bei der Erläuterung Ihres Problems in Ihrer Frage verwendet haben. Erstellen Sie einen bool Vektor mit der genauen Größe Ihres Vektors und initialisieren Sie ihn dann mit false s.

Jetzt jedes Mal, wenn Sie einen Index verwenden, gehen Sie einfach zu Ihrem bool Vektor und ändern Sie diesen Index zu true, bedeutet, dass es zuvor verwendet wurde. Sie können den Wert des jeweiligen Index true || false überprüfen, um zu wissen, ob dieser Index vorher verwendet wurde oder nicht.