2012-11-22 12 views
9

Diese Frage gilt für beide std::set und std::unsorted_set.Erhalten "Index" von Set-Element über Iterator

Ich habe einen Iterator zu einem Element in einem Satz. Ich möchte den Iterator verwenden, um einen "Index" für das Element basierend auf seiner Position in der Menge zu erhalten.

Zum Beispiel die Indizes für mein Set würde wie folgt aussehen:

int index = 0; 

for(MySetType::iterator begin = mySet.begin(); begin != mySet.end(); begin++) 
{ 
    cout << "The index for this element is " << index; 
    index++; 
} 

Ich habe versucht, arithmetische Iteratoren verwenden zu tun, aber es funktioniert nicht:

int index = mySetIterator - mySet.begin(); 

Gibt es eine Möglichkeit zu Verwenden Sie den Iterator, um einen solchen Indexwert basierend auf seiner Position in der Menge zu erhalten?

+0

Der richtige Weg, um einen "Abstand" zwischen zwei Iteratoren zu bekommen ist die [ 'std :: distance'] (http://en.cppreference.com/w/cpp/iterator/distance) -Funktion. Bitte lesen Sie jedoch die Antwort Jack, bevor Sie sie verwenden. –

Antwort

13

STL distance ist was Sie brauchen. std::distance(set.begin(), find_result)

Bitte beachten Sie, dass:

„Gibt die Anzahl der Elemente zwischen dem ersten und letzten der Verhalten nicht definiert ist, wenn zuletzt von der ersten durch (eventuell mehrmals) nicht erreichbar ist Inkrementieren zuerst..“

Bemerkung: Die Komplexität ist linear;

3

std::set und set::unordered_set sind assoziativen Container, nicht Sequenz Behälter, daher der Begriff selbst der Index nicht viel Sinn macht.

Wenn Sie einen Index für einen assoziativen Container abrufen müssen, sollte das Design geändert werden (auch wenn ohne ein Konzept des kleinsten oder zuletzt eingefügten Elements die Indizes in solchen Containern geändert werden).

+0

Ich brauche nur einen "Index", um Elemente (Iteratoren) zu verknüpfen, um Elemente so zu setzen, dass sie in eine Datei geschrieben werden können. Mit anderen Worten, ich habe eine riesige Liste von Set-Iteratoren und möchte nicht dieselben redundanten Set-Element-Daten in eine Datei schreiben. Ich würde lieber die eindeutigen Set-Elemente in eine Datei schreiben und dann für jedes Element einen Index, der sie mit einem bestimmten Set-Element verbindet. – user974967

4

std::set has just a bidirectional iterator, was bedeutet, dass Sie nicht das tun können, was Sie mit operator + (oder) tun möchten. Diese sind nur unter random access iterators, wie std::vector, verfügbar.

Sie müssen std::distance verwenden, um den "Index" zu erhalten, und std::advance, um vom Anfang des Satzes bis zum Ende zu gehen.

auto distance = std::distance(mySet.begin(), someIterator); 
auto it = mySet.begin(); 
std::advance(it, distance); 

assert(it == someIterator); 
+0

Was ist die zeitliche Komplexität der Funktion distance() im Set? Ist es O (1)? – Prince

+1

Nein, da 'set' nur einen' bidirektionalen Iterator' hat, muss 'distance' die Liste durchlaufen. Wenn es "Random-Access-Iteratoren" hätte, könnte es O (1) sein. – moswald

Verwandte Themen