2010-06-29 16 views
13

Mam tę funkcję:'std :: vector <T> :: iterator it;' nie skompilować

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); 
      } 
     } 
    } 

i g ++ daje te błędy:

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 

musi to być coś prostego, ale po dziesięciu minutach patrzył na niego mogę” t znaleźć coś złego. Ktoś jeszcze to widzi?

+2

btw, nie należy używać go '

Odpowiedz

28

Spróbuj to zamiast:

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

Oto strona, która opisuje how to use typename i dlaczego jest to konieczne tutaj.

+0

To się udało. Dzięki. – Max

+0

+1 za zwięzłą odpowiedź i link do szczegółowego wyjaśnienia. – stinky472

8

To, co robisz, jest nieefektywne. Użyj wyszukiwania binarnego zamiast:

#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 - pokonaj mnie. Warto również wspomnieć, że ponieważ bieżący kod nie wyrwie się z pętli po wykonaniu wstawiania, zwykle wstawi dodatkowe kopie nowego elementu tam, gdzie nie są one pożądane. –

+2

@Jerry: Co gorsza, jeśli rozmiar wektora jest równy jego pojemności, 'insert' unieważni wszystkie iteratory uzyskane przed wstawieniem, więc' ++ it' poprowadzi prosto do nieokreślonego terenu zachowania. – fredoverflow

+1

+1 (ale chciałbym móc dać +10). Patrząc na kod po raz drugi, błąd kompilacji jest tylko niewielkim problemem w porównaniu do zachowania kodu w czasie wykonywania. – stinky472

Powiązane problemy