2009-05-28 6 views

risposta

8

Perché gli iteratori sono migliori degli indici?

  • Nei casi in cui indice non è disponibile (come con std :: list, per esempio).
  • Nel caso in cui venga chiamata una funzione generica che accetta un iteratore .
  • Quando si scrive un modello di funzione che dovrebbe funzionare con più di un tipo di contenitore.
  • Esistono per creare uniformità tra tutti i contenitori e possibilità di utilizzare iteratori di tutti i contenitori e puntatori regolari in tutti gli algoritmi standard .
  • Gli iteratori possono puntare a sequenze che non esistono tranne che come concetto. Ad esempio, è possibile creare una classe di iteratore che passi attraverso i numeri primi senza dover effettivamente creare un contenitore di numeri primi.

Tuttavia, se ignorando tipi di contenitori che non supportano l'accesso casuale (la lista, set, ecc), iteratori offrono ancora

  • Pointer come la semantica (pensano di stringa :: iterator vs. char *).
  • Concetto generalizzato utilizzabile oltre l'iterazione su elementi all'interno di un contenitore .
  • In alcuni casi prestazioni migliori rispetto a quelle del membro del contenitore.
+3

Sono d'accordo, e in particolare metterei l'accento su un vantaggio molto pratico: il ciclare attraverso gli elementi di un vettore usando gli iteratori è un errore sicuro per le situazioni off-by-one. Più semplicemente, usare gli iteratori per i vettori è in qualche modo indipendente dalla dimensione. –

+0

Finché è necessario l'accesso sequenziale, hai ragione. In altri casi, non c'è uniformità. – xtofl

4

La modularità è la risposta. Immagina di avvolgere la tua logica in una chiamata di funzione (una buona pratica). In tal caso, facendolo ricevere l'iteratore lo renderà generico, in modo che possa operare su un array in stile C (puntatore), un vettore stl ++ o qualcosa che si comporta come un contenitore iteratore, come ad esempio un elenco collegato.

1

Questa domanda mi è stata posta recentemente riguardo alle prestazioni. Potresti dare un'occhiata alle risposte che ho ricevuto.

Controllare il seguente link: Iterators vs. indexes

La discussione è principalmente su performance, che si è rivelato essere dipendente dalla piattaforma, con lievi modifiche in ogni piattaforma.

+0

Diresti quindi i vantaggi degli iteratori: il suo funzionamento a puntatore come i pochi metodi con cui viene fornito? – Babiker

+0

Questo non è quello che sto dicendo, mi riferisco solo all'aspetto della performance. –

+1

+1 Anche se la domanda riguardava i vantaggi con gli iteratori. Ma gli iteratori DO causano un sovraccarico. Ed è molto evidente. – ralphtheninja

3

Dico la sua portabilità attraverso i contenitori.

Se si scrive un codice utilizzando i vettori e si utilizza l'indice per eseguire l'iterazione, il codice non può essere modificato in altri contenitori in seguito.

typedef std::vector<int> myContainer; //only change here for std::list 

for (myContainer::iterator iter = actualContainer.begin(); 
     iter != actualContainer.end(); 
     ++iter) 
{} 

Nel codice precedente se si desidera passare dal vettore all'elenco, è molto semplice. Se tu avessi usato l'indice allora non sarà possibile.

In caso contrario, poiché il vettore utilizza iteratori di accesso casuale, dovrebbe essere lo stesso.(indice o iteratore qualsiasi cosa è ok)

Problemi correlati