Il più delle volte, entrambi riguardano pratiche altrettanto cattive.
Quello che dovresti normalmente provare a fare è capire cosa realizza il ciclo, e usare un algoritmo esistente o scrivere un nuovo algoritmo per compiere genericamente quel fine, quindi applicare quell'algoritmo alla raccolta / gamma a portata di mano.
Per esempio, supponiamo che stavi sommando gli elementi in un vettore:
int total = 0;
for (int i=0; i<v.size(); i++)
total += v[i];
std::cout << "Total = " << total << "\n";
Riscrivere questo per usare gli iteratori non è sostanzialmente un miglioramento (e probabilmente dannoso):
int total = 0;
for (std::vector<int>::iterator p = v.begin(); p!= v.end(); ++p)
total += *p;
std::cout << "Total = " << total << "\n";
Usando C ++ 11, puoi almeno ripristinare un piccolo equilibrio:
int total = 0;
for (auto p : v)
total += p;
std:cout << "Total = " << total << "\n";
... ma non hai nemmeno bisogno del C ++ 11 per farlo ancora meglio:
std::cout << "Total = "
<< std::accumulate(v.begin(), v.end(), 0)
<< "\n";
Quando ti ritrovi a pensare a scrivere un ciclo, cambiare il loop per usare un iteratore è raramente la risposta giusta - la risposta giusta è di solito eliminare il ciclo e sostituirlo con un algoritmo .