C++
Confronti affiancati di classici esempi C ++ risolti tramite C ++ vs C ++ 11 vs C ++ 14 vs C ++ 17
Ricerca…
Looping attraverso un contenitore
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.