So che lo standard non stabilisce il modo in cui i container STL devono essere implementati, ma piuttosto impone una serie di requisiti per ognuno di essi.Come i container ordinati da STL conoscono la loro fine?
Tuttavia, è ampiamente noto che i contenitori ordinati STL vengono in genere implementati come red–black trees.
È possibile scorrere tra gli elementi di un std::set
o un std::map
utilizzando i rispettivi iteratori o dal C++ 11 utilizzando loop a intervalli.
Ciò che mi imbarazza tuttavia, è come un contenitore ordinato in STL "conosce" la sua "fine". In altre parole, poiché sono implementati come alberi, come viene implementata la fine del contenitore o potrebbe essere implementata la ?
So che la norma impone requisiti §23.2.1/c contenitore Di (sottolineatura mia):
begin() restituisce un iteratore riferimento al primo elemento nel contenitore . end() restituisce un iteratore che rappresenta il valore passato- per il contenitore. Se il contenitore è vuoto, quindi begin() == end();
OK, per i contenitori contigui questo è facile, ma come questo "past-the-end" potrebbe essere materializzato per gli alberi?
Renditi conto che "il passato è il concetto logico, non fisico". Significa letteralmente l'iteratore che ottieni quando passi oltre l'ultima voce valida, ma il contenuto interno di quell'iteratore potrebbe essere qualsiasi cosa. –
Esiste una nozione naturale di next() e end() di terminare gli attraversamenti di alberi come ampiezza prima e profondità prima, quindi non c'è nulla di concettualmente speciale sui rispettivi iteratori. –
@MarkRansom Abbastanza buono, è un concetto logico. Ma come implementa un concetto così logico? Intendo nel codice – 101010