2016-11-27 3 views
-2

Ist es möglich, Auto für Iterationszwecke so zu verwenden?Smartpointer und Iterieren mit Auto

Code erzeugt Fehler, aber ich frage mich, ob es vielleicht möglich ist. Zeile mit Fehler ist kommentiert. Ich bin neugierig, weil ich intelligente Zeiger mag, aber ich möchte weniger tippen ... und ich mag die Idee des schnellen Prototyping mit C++.

 deque<shared_ptr<Vehicle>> data; 
    data.push_back(shared_ptr<Vehicle>(new Vehicle("aba"))); 
    data.push_back(shared_ptr<Vehicle>(new Vehicle("bobo"))); 
    data.push_back(shared_ptr<Vehicle>(new Vehicle("cici"))); 
    data.push_back(shared_ptr<Vehicle>(new Vehicle("dede"))); 
    data.push_back(shared_ptr<Vehicle>(new Vehicle("efee"))); 


    for(auto i = data.begin(); i != data.end;) //error 
    { 
     if((*i)->getName() == "cici") 
     { 
      i = data.erase(i);   //Only works with C++11. i on left side is next valid pos. 

      break; 
     } 
     else 
      ++i; 
    } 
+0

Was ist Ihre eigentliche Frage, obwohl? – Charles

+4

Sollte data.end(); ? – moof2k

+1

Was ist die Fehlermeldung? – Galik

Antwort

3

Natürlich verwenden Sie auto:

for(auto i = data.begin(); i != data.end() ;) { // look at condition 
    ... 
} 

Sie auch bereichs für verwenden können, wenn Sie den Iterator zum Löschen nicht brauchen würde:

for (auto& sptr : data) { 
    ... 
} 
3

Die auto funktioniert gut , das Problem ist, dass es mehrere Fehler in Ihrem Code gibt

for(auto i = data.begin(); i != data.end;) 

sollte

for(auto i = data.begin(); i != data.end();) 

Und

i = list.erase(i); 

Die Variable list ist hier nicht definiert sein, werde ich nehme an, Sie

gemeint
i = data.erase(i); 
+0

ja, du hast Recht. Entschuldigung, das andere Poster hat dich um ein paar Minuten geschlagen. Ich werde dich aufmuntern. Vielen Dank!! – code