Hay una cuarta opción (no necesariamente una buena opción, pero existe).Puede usar iteradores de acceso bidireccional/al azar de una forma que imita la forma iteradores inversa se implementan para evitar el problema con myvec.end()-1
en un iterador vacío:
for (vector<int>::iterator it = myvec.end(); it != myvec.begin(); --it)
{
// convert the loop controlling iterator to something that points
// to the item we're really referring to
vector<int>::iterator true_it = it;
--true_it;
// do stuff here
// but always dereference `true_it` instead of `it`
// this is essentially similar to the way a reverse_iterator
// generally works
int& x = *true_it;
}
o incluso:
for (vector<int>::iterator it = myvec.end(); it != myvec.begin();)
{
// decrement `it` before the loop executes rather than after
// it's a bit non-idiomatic, but works
--it;
int& x = *it;
// do stuff...
}
Como dije, esto no es necesariamente una buena opción (creo que Jerry Coffin's answer es el enfoque que debería tener primero), pero creo que es interesante ya que muestra cómo los iteradores inversos funcionan detrás de escena, y evita tener que convertir un reverse_iterator en un iterador para esos momentos en los que es posible que desee utilizar el iterador con algo que no aceptará un reverse_iterator
(la conversión de reverse_iterator
s a iterator
s siempre parece dolerme la cabeza, por lo que a menudo evitaré reverse_iterators
para evitar dolores de cabeza). Por ejemplo, si desea llamar inserción() para la ubicación de un iterador inverso se refiere a:
// if `it` is a reverse iterator, a call to insert might have to look something like:
myvec.insert(--(it.base()), 42); // assume that you know the current vector capacity
// will avoid a reallocation, so the loop's
// iterators won't be invalidated
// if `it` is a normal iterator...
myvec.insert(it, 42);
"También utiliza> =, que no va a trabajar para iteradores no aleatoria de acceso.". Eso está bien, ni 'fin() -1' ;-) –
+1. Cuando una biblioteca proporciona funcionalidades diseñadas explícitamente para realizar una tarea, por lo general debe usarla cuando intente realizar la misma tarea. – Brian
@Steve: Heh, cierto. Estaba pensando en 'end() -' que funciona para iteradores bidireccionales. – GManNickG