loop instead for example ejemplo based c++ stl iterator c++11

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.