C++ Looping attraverso un contenitore


Esempio

In C ++, è possibile eseguire il looping di un contenitore di sequenza c utilizzando gli indici nel modo seguente:

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

Sebbene semplici, tali scritti sono soggetti a errori semantici comuni, come un operatore di confronto errato o una variabile di indicizzazione errata:

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

Il ciclo può essere realizzato anche per tutti i contenitori che utilizzano iteratori, con inconvenienti simili:

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11 ha introdotto la gamma per loop e auto parola chiave auto , permettendo al codice di diventare:

for(auto& x : c) x = 0;

Qui gli unici parametri sono il contenitore c e una variabile x per contenere il valore corrente. Ciò impedisce gli errori di semantica precedentemente indicati.

Secondo lo standard C ++ 11, l'implementazione sottostante è equivalente a:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

In tale implementazione, l'espressione auto begin = c.begin(), end = c.end(); le forze begin e end per essere dello stesso tipo, mentre la end non viene mai incrementata, né dereferenziata. Quindi il ciclo basato su intervallo funziona solo per contenitori definiti da un iteratore / iteratore di coppie. Lo standard C ++ 17 allenta questo vincolo modificando l'implementazione in:

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

Qui begin e end possono essere di tipi diversi, purché possano essere confrontati per disuguaglianza. Ciò consente di scorrere più contenitori, ad esempio un contenitore definito da un iteratore / sentinella pair.