2016-02-18 6 views

risposta

5

Come descritto nella risposta da Chad, il tuo ciclo for itera sopra il vostro vector, utilizzando i suoi iteratori begin e end. Questo è il comportamento della sintassi del colon :.

quanto riguarda la tua const auto & sintassi: si dovrebbe immaginare che il codice viene fuori di esso:

// "i" is an iterator 
const auto& ioDev = *i; 

L'espressione *i è (un riferimento a) il tipo di elementi nel contenitore: Device *. Questo è il tipo dedotto di auto. Perché devi const & allegato al vostro auto, la variabile ioDev è un const riferimento al tipo dedotta (un puntatore), come se fosse dichiarato in questo modo:

const Device *& ioDev = *i; 

Sembra inutilmente complicato; se avete bisogno di iterazione solo normale (e non ad esempio manipolare l'indirizzo del puntatore, che credo sia altamente improbabile), utilizzare una pianura non modificata auto:

for (auto ioDev : deviceList) 

o un tipo esplicito:

for (Device* ioDev : deviceList) 
9

Questa è una serie basata ciclo for, esso ha lo stesso comportamento di base di:

for(auto it = deviceList.begin(); it != deviceList.end(); ++it) 
{ 
    const auto& ioDev = *it; 
} 

La gamma di base per il ciclo è rapidamente diventato uno dei miei costrutti preferiti, è terso e quando è necessario iterare un intera gamma, funziona anche (e in modo più efficiente) possibile.

Se sono necessari gli altri costrutti di un ciclo for tipico (diciamo di uscire prima in alcuni casi), quindi il range-based non è per tale caso d'uso.

+0

L'uscita da loop per loop a causa di una particolare condizione può ancora essere facilmente ottenuta usando 'break'. IMHO un'istruzione addizionale 'if' nel corpo del loop è ancora molto più pulita rispetto alla costruzione di un loop" tradizionale "con una particolare condizione di arresto. Nella mia esperienza, la necessità di un ciclo "tradizionale" per lo più si verifica quando il contenitore viene mutato nel corpo del ciclo. – schlimmchen

2

Il "nuovo" ciclo for semplicemente scorre su tutti gli elementi di deviceList. In ogni iterazione del corpo del ciclo, ioDev è un riferimento const a ciascuno degli elementi di deviceList, successivamente.

Per quanto riguarda il tipo di ioDev: è di tipo Device *const &, come si può vedere nella seguente:

#include <vector>                                                
#include <type_traits> 


using namespace std; 


int main() 
{ 
    vector<int *> v; 

    for(const auto &r: v) 
    { 
     static_assert(is_same<decltype(r), int *const &>::value, "wrong type"); 
    } 
} 
Problemi correlati