2013-10-06 7 views
8

Leggere Lavorare Progetto N3337-1, standard per il linguaggio di programmazione C++, iteratori 24.2.5 in avanti, pagina 806.Che cos'è la garanzia multi-pass per lo standard ISO C++?

Da progetto:

Due iteratori dereferenceable a e b di tipo X offerta la garanzia multi-pass se:
- a == b implica ++a == ++b e
- X è un tipo puntatore o l'espressione (void)++X(a), *a è equivalente all'espressione *a.

[Nota: Il requisito che a == b implica ++a == ++b (che non è vero per iteratori di ingresso e di uscita) e alla rimozione delle restrizioni sul numero delle assegnazioni attraverso un iteratore mutevole (che si applica a iteratori di uscita) permette l'uso di algoritmi one-directional multi-pass con iteratori forward. -end note]

Qualcuno potrebbe re-interpretarlo in termini più semplici? Comprendo che gli iteratori di inoltro sono multi-pass, ma non capisco come ciò sia realizzato secondo i requisiti standard C++.

+1

+1 Perché lo trovo appropriato per questa comunità anche quando non affronta problemi di programmazione specifici e perché si potrebbe avere difficoltà a leggere C++ Standard in effetti. – LihO

risposta

13

I termini dicono tutto, direi: è possibile passare attraverso la sequenza più volte e ricordare le posizioni all'interno della sequenza. Finché la sequenza non cambia, a partire da una posizione specifica (iteratore) attraverserai gli stessi oggetti tutte le volte che vuoi nello stesso ordine. Tuttavia, puoi solo andare avanti, non c'è modo di tornare indietro. L'esempio canonico di una sequenza come questa è una lista collegata singolarmente.

La clausola citata in pratica dice, che se si hanno due iteratori confronto uguali e si incrementa ognuno di loro, si arriva alla stessa posizione e confrontare pari di nuovo:

if (it1 == it2) { 
    ++it1; 
    ++it2; 
    assert(it1 == it2); // has to hold for multi-pass sequences 
} 

L'espressione un po 'strano ++X(a), *a è fondamentalmente inteso a far avanzare un iteratore indipendente da a e il requisito che ++X(a), *a sia equivalente a *a significa in sostanza che l'iteratore sulla sequenza che utilizza un iteratore indipendente non modifica ciò a cui fa riferimento a. Questo è diverso da input iterator dove ++InIt(a), *a non è necessariamente equivalente a *a poiché la prima espressione può avere cambiato la posizione, eventualmente invalidando a e/o modificare il valore a cui si riferisce.

Al contrario, la sequenza single-pass (iterazioni di input e output in termini standard) può essere attraversata solo una volta: provare a percorrere la sequenza più volte non funzionerà necessariamente. L'esempio canonico di sequenze come questa viene immesso dalla tastiera e inviato alla console: una volta letto, non è possibile recuperare di nuovo gli stessi caratteri e una volta inviato non è possibile annullare i caratteri.

Problemi correlati