¿Es legal usar un reverse_iterator con std::equal?

Por ejemplo, ¿alguno de estos es legal?

std::equal(v.begin(), v.end(), w.rbegin())

std::equal(v.rbegin(), v.rend(), w.begin())

std::equal(v.rbegin(), v.rend(), w.rbegin())
8
Thomas Eding 30 may. 2012 a las 22:40
3
Todos lo son, ¿qué te hace pensar lo contrario?
 – 
Xeo
30 may. 2012 a las 22:41
@Xeo: cplusplus.com/reference/algorithm/equal dice en Parámetros que acepta iteradores directos y no menciona los iteradores inversos.
 – 
Thomas Eding
30 may. 2012 a las 22:42
4
Estás mezclando nombres de iteradores y sus categorías. Además, std::equal requiere al menos iteradores de entrada, que son un subconjunto de iteradores hacia adelante.
 – 
Xeo
30 may. 2012 a las 22:44
1
Reverse_iterators pueden ser iteradores hacia adelante, por muy confuso que parezca.
 – 
Benjamin Lindley
30 may. 2012 a las 22:44
2
: En realidad, deben ser, ya que el requisito mínimo de categoría de iterador para std::reverse_iterator<> es bidireccional. ; -]
 – 
ildjarn
30 may. 2012 a las 22:45

1 respuesta

La mejor respuesta

Todos son válidos, porque los iteradores inversos son , de hecho, iteradores directos .

El "iterador inverso" no es una categoría de iterador. Recuerde algunas categorías de iteradores:

  • Un iterador que puede desreferenciarse (*) e incrementarse (++) es un iterador hacia adelante.
  • Un iterador de avance que también se puede disminuir es un iterador bidireccional.
  • Un iterador de acceso aleatorio es un iterador bidireccional que también tiene operadores + y -.

Por otro lado, un iterador inverso es un iterador bidireccional o un iterador de acceso aleatorio que mira una colección al revés. Mirar

http://www.cplusplus.com/reference/std/iterator/reverse_iterator/

... especialmente lo que dice sobre iterator_category bajo el encabezado "Tipos de miembros".

9
wolfgang 30 may. 2012 a las 22:55
No enlace a cplusplus.com; cppreference.com es mucho mejor.
 – 
ildjarn
30 may. 2012 a las 23:08