2012-11-22 23 views
9

To pytanie dotyczy zarówno std::set, jak i std::unsorted_set.uzyskiwanie "indeksu" elementu zestawu za pomocą iteratora

Mam iteratora do elementu w zestawie. Chciałbym użyć iteratora, aby uzyskać "indeks" dla elementu na podstawie jego lokalizacji w zestawie.

Na przykład, wskaźniki dla mojego zestawu będzie w następujący sposób:

int index = 0; 

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

Próbowałem robić arytmetycznych za pomocą iteratorów, ale to nie działa:

int index = mySetIterator - mySet.begin(); 

Czy istnieje jakiś sposób, aby użyć iteratora, aby uzyskać taką wartość indeksu na podstawie jego lokalizacji w zestawie?

+0

Prawidłowy sposób na uzyskanie "odległość" między dwoma iteratorów jest funkcja [ 'std :: distance'] (http://en.cppreference.com/w/cpp/iterator/distance). Jednak przeczytaj odpowiedź Jack przed użyciem. –

Odpowiedz

13

STL distance jest tym, czego potrzebujesz. std::distance(set.begin(), find_result)

Uwaga:

„Zwraca liczbę elementów między pierwszą a ostatnią Zachowanie jest niezdefiniowany jeśli ostatni nie jest osiągalny z najpierw (ewentualnie kilkakrotnie) zwiększający pierwszy.”.

Uwaga: złożoność jest liniowa;

3

std::set i set::unordered_setasocjacyjne pojemniki, nie sekwencja kontenery, stąd koncepcja sama indeksu nie ma większego sensu.

Jeśli konieczne jest pobranie indeksu dla pojemnika asocjacyjnego, projekt powinien zostać zmieniony (nawet dlatego, że bez koncepcji najmniejszego lub ostatnio wstawionego elementu indeksy w takich pojemnikach mogą ulec zmianie).

+0

Potrzebuję tylko "indeksu" do łączenia elementów (iteratorów), aby ustawić elementy w sposób, który można zapisać do pliku. Innymi słowy, mam ogromną listę zestawów iteratorów i nie chcę zapisywać tych samych nadmiarowych elementów zestawu danych do pliku. Wolę napisać unikalne elementy zestawu do jednego pliku, a następnie indeks dla każdego elementu, łącząc je z konkretnym elementem zestawu. – user974967

4

std::set has just a bidirectional iterator, co oznacza, że ​​nie możesz zrobić tego, co próbujesz zrobić z operator + (lub -). Są one dostępne tylko dla random access iterators, takich jak std::vector.

Musisz użyć std::distance, aby uzyskać "indeks", a std::advance, aby przejść od początku zestawu do końca.

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

assert(it == someIterator); 
+0

Jaka jest złożoność czasu funkcji distance() w przypadku zestawu? Czy to O (1)? – Prince

+1

Nie, ponieważ 'set' ma tylko' dwukierunkowy iterator', 'distance' musi przejść listę. Gdyby miał "iteratory dostępu swobodnego", może to być O (1). – moswald

Powiązane problemy