2009-06-23 10 views
34

¿Puedo hacer cálculos normales con iteradores, es decir, simplemente incrementarlo agregando un número?¿Puedo incrementar un iterador simplemente agregando un número?

A modo de ejemplo, si quiero retirar el elemento vec[3], ¿puedo hacer esto:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

Funciona para mí (g ++), pero no estoy seguro de si es garantizado trabajar.

Respuesta

42

Funciona si el iterador es un iterador de acceso aleatorio, cuyos iteradores son (consulte reference). La función STL std::advance se puede utilizar para avanzar un iterador genérico, pero como no devuelve el iterador, tiendo a usar + si está disponible porque parece más limpio.

C++ 11 nota

Ahora hay std::next y std::prev, que hacer devolver el iterador, por lo que si usted está trabajando en la tierra plantilla que puede utilizar para avanzar en un iterador genérico y todavía tienen código limpio

+7

Oh, ¿entonces no funcionaría para std :: list? – Frank

+2

Correcto; agregó algunos enlaces de documentación que enumeran qué funciones deberían estar disponibles para qué tipos de iteradores. –

+1

No, no es así. El operador + significa "en un paso, salta tan adelante" que un iterador de lista no puede hacer. Los iteradores de acceso directo no aleatorio (como los iteradores de lista) solo admiten el operador de incremento (++) para avanzar un elemento a la vez. Como dijo Todd, puede usar std :: advance, que invoca al operador ++ repetidamente, para expresar de manera sucinta la idea de mover un iterador no aleatorio hacia adelante en una serie de pasos. –

2

Funciona con iteradores de acceso aleatorio. En general, es posible que desee mirar std::advance, que es más genérico. Solo asegúrese de comprender las implicaciones de rendimiento de usar esta plantilla de función.

Cuestiones relacionadas