2010-06-29 24 views
13

Tengo esta función:'std :: vector <T> :: iterator it;' no compila

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

y g ++ da estos errores:

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 

debe ser algo sencillo, pero al cabo de diez minutos de mirar a lo que pueda' t encuentra algo mal. ¿Alguien más lo ve?

+2

por cierto, no se debe utilizar 'it

Respuesta

28

Tal vez puedas probar:

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

Aquí hay una página que describe how to use typename y por qué es necesario en este caso.

+0

Eso lo hizo. Gracias. – Max

+0

+1 para respuestas concisas y un enlace para la explicación detallada. – stinky472

8

Lo que está haciendo es ineficiente. Utilizar una búsqueda binaria en su lugar:

#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 - golpéame. También es probable que valga la pena mencionar que dado que el código actual no se saldrá del ciclo después de hacer la inserción, típicamente insertará copias adicionales del nuevo elemento donde no se deseen. –

+2

@Jerry: Peor aún, si el tamaño del vector es igual a su capacidad, 'insert' invalidará todos los iteradores obtenidos antes de la inserción, por lo que' ++ it' conducirá directamente a un comportamiento indefinido. – fredoverflow

+1

+1 (pero desearía poder dar +10). Al mirar el código una segunda vez, el error de compilación no es más que un problema menor en comparación con el comportamiento en tiempo de ejecución del código. – stinky472

Cuestiones relacionadas