Zastanawiam się, w jaki sposób iteratory ustawione w C++ działają w STL. Domyślam się, że zestaw jest zaimplementowany przy użyciu drzewa wyszukiwania binarnego, co oznacza, że iteratory wykonują w trybie inordacji to drzewo. Ale moje pytanie brzmi: kiedy robią to przechodzenie, na samym początku , kiedy robimy to: it = s.begin() i przechowujemy wewnętrznie przechodzące wskaźniki w rodzaju stosu i odnosimy się tylko do tej struktury danych przy każdej inkrementacji w iteratorze lub inkrementacja w iteratorze powoduje nowe przejście na drzewo.Jak działa Iterator w zestawie
Znaczy kiedy zainicjować jak
set<int> s;
set<int>::iterator it;
//and then use it like:
for(it = s.begin(); it!=s.end();)
{
dosth();
++it; // does this do a inorder traversal of the tree again to find the next
// node or it gets the next node in the tree by reading the internal
// data structure(of inorder traversal) which is created when we do s.begin().
}
dziękuję za odpowiedź .... ale pozwól mi umieścić moje pytanie w inny sposób .. jak zaimplementować inkrementację operacji iteratorów na std :: zestaw, jeśli zostałeś poproszony o zrobienie tego .. celowo wewnętrznie zaimplementowane węzły za pomocą drzewa wyszukiwania binarnego zamiast listy połączonej ... zrobiłbyś niewidoczne przemieszczenie tego drzewa za każdym razem przy każdej inkrementacji ++ .. lub zapiszesz zamówienie w sposób intencjonalny i odsyłasz do niego za każdym razem, gdy robisz ++ to – raja
@raja: Nie możesz zaimplementować 'std :: set' używając prostej, połączonej listy. Znalezienie elementu w zbiorze musi być O (log N), ale znalezienie elementu na połączonej liście to O (N). To musi być drzewo. Jeśli węzeł drzewa przechowuje wskaźnik do swojego węzła nadrzędnego, 'it ++' zawsze może znaleźć następną najwyższą wartość bez pełnego przejścia drzewa. – MSalters