2012-03-27 13 views
8

Dato il seguente utilizzo di auto:C++ 11 auto e size_type

std::vector<int> v; 
for (auto i = 0; i < v.size(); ++i) { 
    ... 
} 

sarebbe ideale per C++ per dedurre i come std::vector<int>::size_type, ma se si guarda solo l'inizializzatore per i, si vedrebbero un numero intero Qual è il tipo dedotto di i in questo caso? È l'uso appropriato di auto?

+0

Senza sapere cosa si fa con 'i' è impossibile dirlo. –

+0

Non ho mai saputo che 'auto' è usato per dedurre il tipo appropriato di una variabile! lo fa? –

+3

@ Mr.TAMER Sì, hanno cambiato il suo significato in C++ 11. –

risposta

20

Utilizzare decltype anziché auto per dichiarare i.

for(decltype(v.size()) i = 0; i < v.size(); ++i) { 
    // ... 
} 

Ancora meglio, utilizzare gli iteratori per scorrere il vettore come mostra la risposta di @BarraB.

+3

o, meglio ancora, utilizzare il ciclo basato su intervallo, come nella risposta di seguito. – juanchopanza

13

Perché non risolvere il problema con gli iteratori? Poi il problema scompare:

std::vector<int> v; 
for (auto i = v.begin(); i != v.end(); ++i) { 
    ... 
} 

Se volete iterare utilizzando indici avrei probabilmente solo esplicitamente precisare il tipo: Sai di cosa si tratta. auto viene principalmente utilizzato per tipi di modelli sconosciuti o difficili da digitare.

+1

deve essere avviato (v) e fine (v) – Klaim

3

auto ottiene il tipo esclusivamente dall'inizializzatore. Non si presta attenzione ad altri usi, almeno non per determinare il tipo di variabile. Per tenerne conto, così, decltype è un'opzione:

for (decltype(v.size()) i = 0; i < v.size(); ++i) 

o, sarai in grado di riscrivere il ciclo di andare a ritroso:

for (auto i = v.size(); i-- != 0;) 

o, si può essere in grado di evitare il Ciclo for interamente.

7

La risposta alla tua domanda "È l'uso appropriato dell'auto?" è no per ragioni spiegate in altre risposte. Per il caso particolare di loop attraverso il contenuto di un contenitore, è più probabile meglio con una gamma based per-ciclo:

accesso riferimento const ad elementi, i è const int&:

std::vector<int> v; 
for (const auto& i : v) { 
    std::cout << i << "\n"; 
} 

non accesso riferimento const, i è int&:

std::vector<int> v; 
for (auto& i : v) { 
    ++i; 
    std::cout << i << "\n"; 
} 

accesso valore, i è int:

0.123.
std::vector<int> v; 
for (auto i : v) { 
    ... 
} 

e così via. Questo funziona anche per gli array in stile C.