2011-08-04 14 views
27

Supongamos que tengo uncómo conseguir iterador a una posición particular de un vector

std::vector<int> v 
//and ... 
for(int i =0;i<100;++i) 
v.push_back(i); 

ahora quiero un iterador a, digamos décimo elemento del vector.

sin hacer el siguiente enfoque

std::vector<int>::iterator vi; 
vi = v.begin(); 
for(int i = 0;i<10;i++) 
    ++vi; 

ya que se echan a perder la ventaja de tener iterador de acceso aleatorio para un vector.

+0

Posible duplicado de [C++ STL Vectors: Obtener iterador del índice?] (Http://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index) –

Respuesta

35

Solo agregue 10 al iterador. Están destinados a "sentir" como punteros.

+0

gracias ... eso fue útil –

+1

¿No quieres agregar 9? Añadiendo 0 movimientos al primer elemento, Añadiendo 1 movimientos al 2º elemento, ... Añadiendo n-1 se mueve al enésimo elemento. – Shillard

+0

Eso es resbaladizo. :-) –

46

Esto funciona con cualquier iterador de acceso aleatorio, tal como uno de vector o deque:

std::vector<int>::iterator iter = v.begin() + 10; 

Si desea una solución que funcione para cualquier tipo de iterador, utilice next:

std::vector<int>::iterator iter = std::next(v.begin(), 10); 

O si no estás en una aplicación C++ 11, advance:

std::vector<int>::iterator iter = v.begin(); 
std::advance(iter, 10); 
+0

gracias ... rite ahora solo agrego 10 trabajos para mí. Pero tomaré nota del avance. –

+1

Preferiría std :: advance() ya que funciona con cualquier iterador; de esa manera no estás atado a un contenedor específico. –

+0

@Matt: con toda probabilidad, si su algoritmo requiere acceso en n-elemento, sería inútilmente ineficiente con cualquier otra cosa que no sean los iteradores de acceso aleatorio; por lo que sería mejor utilizar 'operator +' en lugar de 'std :: advance' y obtener un error de compilación con el tipo de iterador incorrecto. – ildjarn

Cuestiones relacionadas