2012-03-27 6 views
8

die folgende Verwendung von auto Gegeben:C++ 11 Auto und size_type

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

Es wäre ideal für C++ i als std::vector<int>::size_type abzuleiten, aber wenn es nur an dem Initialisierer für i sieht, würde es sehen eine ganze Zahl. Was ist der abgeleitete Typ von i in diesem Fall? Ist diese angemessene Verwendung von auto?

+0

Ohne zu wissen, was Sie mit "i" tun, ist es unmöglich zu sagen. –

+0

Ich wusste nie, dass 'auto' verwendet wird, um den passenden Typ einer Variablen abzuleiten! macht es? –

+3

@ Mr.TAMER Ja, sie haben ihre Bedeutung in C++ 11 geändert. –

Antwort

20

Verwenden Sie decltype anstelle von auto, um i zu deklarieren.

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

Noch besser, verwenden Sie Iteratoren über den Vektor als @ der MarkB Antwort zeigt iterieren.

+3

Oder noch besser, verwenden Sie Bereich-basierte für-Schleife, wie in der Antwort unten. – juanchopanza

13

Warum lösen Sie nicht Ihr Problem mit Iteratoren? Dann geht das Problem weg:

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

Wenn Sie mit Indizes iterieren möchten, würde ich wahrscheinlich nur den Typ explizit buchstabieren: Sie wissen, was es ist. auto wird in erster Linie für unbekannte oder schwer zu typierende Template-Typen verwendet, glaube ich.

+1

sollte es beginnen (v) und Ende (v) – Klaim

3

auto erhält den Typ ausschließlich vom Initialisierer. Andere Verwendungen werden nicht berücksichtigt, zumindest nicht, um den Typ der Variablen zu bestimmen. Um dies zu berücksichtigen als auch, ist decltype eine Option:

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

oder können Sie in der Lage sein, die Schleife neu zu schreiben, rückwärts zu gehen:

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

oder können Sie in der Lage zu vermeiden, die for Schleife vollständig.

7

Die Antwort auf Ihre Frage "Ist diese angemessene Verwendung von Auto?" ist nein aus Gründen, die in anderen Antworten erklärt werden. Für den besonderen Fall der durch den Inhalt eines Behälters, Looping, Sie sind wahrscheinlich besser mit einem Bereich auf Basis for-Schleife:

const Referenz Zugriff auf Elemente, i ist const int&:

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

nicht- const Referenzverbindung, ist iint&:

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

Wert Zugriff, i ist int:

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

und so weiter. Dies funktioniert auch für C-artige Arrays.