2010-08-08 6 views
21

I-Code, der Vektor verwenden gesehen haben,Verwenden Sie das Schlüsselwort auto in C++ STL

vector<int>s; 
s.push_back(11); 
s.push_back(22); 
s.push_back(33); 
s.push_back(55); 
for (vector<int>::iterator it = s.begin(); it!=s.end(); it++) { 
    cout << *it << endl; 
} 

Es gleiche ist wie

for (auto it = s.begin(); it != s.end(); it++) { 
    cout << *it << endl; 
} 

Wie sicher ist in diesem Fall die Verwendung des Schlüsselwort auto? Und was ist, wenn die Art des Vektors float ist? string?

Antwort

38

Das Schlüsselwort auto fragt einfach den Compiler, um den Typ der Variablen aus der Initialisierung abzuleiten.

Selbst ein Pre-C++ 0x-Compiler weiß, was der Typ eines (Initialisierungs-) Ausdrucks ist, und meistens können Sie diesen Typ in Fehlermeldungen sehen.

#include <vector> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    vector<int>s; 
    s.push_back(11); 
    s.push_back(22); 
    s.push_back(33); 
    s.push_back(55); 
    for (int it=s.begin();it!=s.end();it++){ 
     cout<<*it<<endl; 
    } 
} 

Line 12: error: cannot convert '__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >' to 'int' in initialization 

Die Auto Keyword einfach Sie die Vorteile dieses Wissen nehmen können - wenn Sie (Compiler) die richtige Art wissen, nur für mich wählen!

+0

Ich benutze Visual C++ 2010, so hat mein Compiler kein Problem mit Auto-Schlüsselwort –

+0

Schöne Erklärung. +1 – jalf

+3

Ich insbesondere, dass so 'auto' ist * heluvalot * kürzer als der tatsächliche Typ. –

11

Das Schlüsselwort auto erhält den Typ aus dem Ausdruck rechts von =. Daher wird es mit jedem Typ funktionieren, die einzige Voraussetzung ist, die automatische Variable zu initialisieren, wenn sie deklariert wird, so dass der Compiler den Typ ableiten kann.

Beispiele:

auto a = 0.0f; // a is float 
auto b = std::vector<int>(); // b is std::vector<int>() 

MyType foo() { return MyType(); } 

auto c = foo(); // c is MyType 
+10

Obwohl technisch korrekt. Ich hoffe, das wird eine schlechte Übung. Wenn jeder nur alle seine Variablen "auto" deklariert, wird es für Menschen schwer werden, zu lesen und zu verstehen (und wir gehen den Weg zu nicht typisierten Sprachen). Die Verwendung von Auto sollte für Situationen reserviert werden, in denen uns der Typ eigentlich egal ist, solange er sich in einem Manor verhält, das wir wollen (zum Beispiel Iteratoren, es interessiert uns nicht, welchen Iterator wir so lange wie möglich erhalten) verwende es wie einen Iterator). –

+1

@Martin: Kein Scherz, das erste Mal, als ich einen Block von 'Auto'-Variablen sah, dachte ich" bitte stirb schnell. " Wie du gesagt hast, sollte es in solchen Situationen verwendet werden, in denen man "eine Variable gimme, egal welcher Typ es ist", nicht "deklariere eine Variable, und folge daraus ihrem Typ aus dem Initialisierer hehehehe!" versuchen, kniffliger Mist zu sein. – GManNickG

+0

@sverkerw: Nein. Ich meine, es ist schwer für Menschen zu lesen. Was ist die Art von c? Muss ich es wissen? Wie wirkt sich das auf meine Interpretation des restlichen Codes aus? –

3

auto Stichwort in einer solchen Situation verwenden soll, ist es absolut sicher. Aber leider ist es nur in C++ 0x verfügbar, so dass es Probleme mit der Portabilität gibt.

21

Es ist zusätzliche Informationen und ist keine Antwort. Aber da ich nicht genug Ruf zu kommentieren, ich kann hier nur schreiben:

In C++ 11 können Sie schreiben:

for (auto& it : s) { 
    cout << it << endl; 
} 

statt

for (auto it = s.begin(); it != s.end(); it++) { 
    cout << *it << endl; 
} 

Es hat die gleiche Bedeutung.

Aktualisieren: Siehe auch den Kommentar von @ Alnitak.

+12

diese sind nicht gleichwertig - in der ersten ist die Variable 'it' vom Typ' value_type' und ist eigentlich kein Iterator. – Alnitak

+0

Ich würde "std :: endl" durch '' \ n "' in diesem Fall ersetzen, was den Löschvorgang verhindert. [Motivation] (https://stackoverflow.com/questions/213907/c-stdendl-vs-n) – JHBonarius

2

Dies ist ein neues Element in der Sprache, mit der wir uns in den nächsten Jahren zu kämpfen haben werden. Das "Auto" des Startes stellt nicht nur Lesbarkeitsprobleme dar, von nun an müssen Sie, wenn Sie darauf stoßen, viel Zeit damit verbringen, herauszufinden, ob es überhaupt funktioniert (genau wie die Zeit, die der Praktikant alle Variablen xyz genannt hat :)) Sie werden auch eine beträchtliche Zeit damit verbringen, nach leicht erregbaren Programmierern zu putzen, wie die, die vor mir geantwortet haben. Beispiel von oben, ich kann $ 1000 setzen, wird geschrieben werden "für (auto es: s)", nicht "für (auto & it: s)", als Ergebnis sendende Bewegung Semantik, wo Sie erwartet, es zu ändern Sammlung unter.

Ein anderes Beispiel für das Problem ist Ihre Frage selbst.Sie wissen eindeutig nicht viel über stl Iteratoren und Sie versuchen, diese Lücke durch die Verwendung der Magie von "Auto" zu überwinden, als Ergebnis erstellen Sie den Code, der später problematisch sein könnte

Verwandte Themen