2010-06-29 6 views
13

ich diese Funktion haben:'Std :: Vektor <T> :: Iterator es;' nicht kompilieren

template<typename T> 
    void Inventory::insertItem(std::vector<T>& v, const T& x) 
    { 
     std::vector<T>::iterator it; // doesn't compile 
     for(it=v.begin(); it<v.end(); ++it) 
     { 
      if(x <= *it) // if the insertee is alphabetically less than this index 
      { 
       v.insert(it, x); 
      } 
     } 
    } 

und g ++ gibt diese Fehler:

src/Item.hpp: In member function ‘void 
yarl::item::Inventory::insertItem(std::vector<T, std::allocator<_CharT> >&, const T&)’: 
src/Item.hpp:186: error: expected ‘;’ before ‘it’ 
src/Item.hpp:187: error: ‘it’ was not declared in this scope 

es muss etwas einfach sein, aber nach zehn Minuten und starrte es an, ich kann‘ Ich finde nichts falsch. Jeder andere sieht es?

+2

btw, sollten Sie nicht verwenden, 'es

Antwort

28

Versuchen Sie stattdessen:

typename std::vector<T>::iterator it; 

Hier ist eine Seite, die how to use typename und warum beschreibt es ist hier notwendig.

+0

Das hat es getan. Vielen Dank. – Max

+0

+1 für knappe Antwort und einen Link für die detaillierte Erklärung. – stinky472

8

Was Sie tun, ist ineffizient. Verwenden Sie eine binäre Suche statt:

#include <algorithm> 

template <typename T> 
void insertItem(std::vector<T>& v, const T& x) 
{ 
    v.insert(std::upper_bound(v.begin(), v.end(), x), x); 
} 
+2

+1 - schlag mich dazu. Es ist auch erwähnenswert, dass, da der aktuelle Code nach dem Einfügen nicht aus der Schleife ausbricht, er typischerweise zusätzliche Kopien des neuen Elements einfügt, wo sie nicht erwünscht sind. –

+2

@Jerry: Noch schlimmer, wenn die Größe des Vektors gleich seiner Kapazität ist, wird 'insert' alle Iteratoren ungültig machen, die vor der Einfügung erhalten wurden, so dass '++ it' direkt in undefiniertes Verhalten landen wird. – fredoverflow

+1

+1 (aber ich wünschte, ich könnte +10 geben). Wenn Sie den Code ein zweites Mal betrachten, ist der Erstellungsfehler nur ein kleines Problem im Vergleich zum Laufzeitverhalten des Codes. – stinky472

Verwandte Themen