2010-02-28 20 views
11

Actualmente utilizo un iterador para buscar a través de un vector y probar sus elementos. Puedo acceder a los elementos que utilizan¿Puedo hacer aritmética de puntero en un STL :: vector :: iterator

std::vector<int>::iterator it; 
if (*it == 0); 

¿Puedo usar la misma lógica aritmética estilo de puntero para probar también el elemento siguiente (sin alterar mi iterador)?

primero tengo que ver si va a empujar el iterador fuera de los límites

if (it != myvec.end()) 

continuación, prueba de tanto elemento actual y el siguiente elemento

if (*it == 1 && *(it + 1) == 1) 

es que esto funciona como yo esperaría de uso de punteros?

Respuesta

16

Sí, los iteradores para std::vector son random access iterators por lo que puede sumar/restar valores integrales para obtener otros iteradores válidos.

Técnicamente, puede no ser una aritmética de puntero, pero funcionan igual que los punteros.

+0

Entonces, no puedo hacer operaciones aritméticas en 'list :: iterator', ¿verdad? – Alcott

+1

@Alcott - correcto. Un list :: iterator es un iterador bidireccional y no admite el acceso aleatorio. Puede usar 'std :: advance' para hacer el movimiento con una sola llamada, pero la complejidad del avance es' O (n) 'para las listas (donde sería' O (1) 'para un vector). –

3

Esto funcionará de hecho como vector iterator, es un iterador de acceso aleatorio. No solo puedes actuar sobre ellos como lo harías con los punteros, sino que están más o menos implementados usando punteros/aritmética de punteros.

1

comportamiento Bueno, si iterador es el último elemento del contenedor y luego

*(it + 1) 

ha indefinido. Debe comprobar que

it + 1 != end 

antes derreferenciándolo.

+1

Así que un poco como usar punteros, tienes que asegurarte de que no salga de los límites. – Dom