c++ - example - use range based for loop instead
C++ 11: funciones no residentes de rbegin()/rend() (2)
Dado que las funciones nonmember begin()
y end()
se agregaron para los contenidos estándar en la revisión C ++ 11, ¿por qué las versiones no rbegin()
de las rbegin()
y rend()
no se han agregado también? Me siento tonto después de comenzar a usar las versiones para no miembros de begin()
y end()
, solo para encontrar que ahora tengo que alternar entre el uso de las llamadas de función miembro y no miembro. (Me doy cuenta de que sería trivial rodar mis propias versiones no miembros de rbegin()
y rend()
, pero me pregunto por qué esto no se agregó al estándar).
Gracias por tu contribución.
Puede construir un rango inverso usando manualmente std::reverse_iterator
en los resultados de std::begin
y std::end
.
Curiosamente, no hay una función de fábrica estándar para reverse_iterator
. Si hubiera, probablemente se vería así:
template< typename iter >
std::reverse_iterator< iter > reverse( iter i )
{ return { i }; }
Armado con esto, puedes hacer
std::sort( reverse( std::end( my_array ) ), reverse( std::begin( my_array ) ) );
Este ejemplo ahorra la molestia de especificar el comparador std::greater
, pero reverse_iterator
concebible que el reverse_iterator
afecte negativamente el rendimiento si el compilador no puede eliminar la complejidad añadida de los bucles internos.
Para las personas que ven esto más tarde, los no miembros rbegin()
y rend()
ya están en C ++ 14.