2012-04-07 18 views
17

Desde que se añaden los no miembros begin() y end() funciones para estándar contiene en la revisión C++ 11, no por qué tener las versiones que no son miembros de las funciones rbegin() y rend() sido agregado también? Me siento tonto después de comenzar a usar las versiones que no son miembros de begin() y end(), solo para encontrar que ahora tengo que alternar entre el uso de las llamadas a funciones miembro y no miembro. (Me doy cuenta de que sería trivial rodar mis propias versiones para no miembros de rbegin() y rend(), pero me pregunto por qué esto no se agregó al estándar).C++ 11: rbegin No miembro()/rend() Funciones

Gracias por su aportación.

+0

Recuerdo que se dijo algo sobre esto en una de las presentaciones en [Going Native 2012] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012). Parece que estas funciones simplemente se olvidaron y pueden (¿se?) Agregarse en el estándar en un momento posterior. –

+0

Las funciones non-member 'begin()' y 'end()' son utilizadas por la nueva forma de la instrucción 'for' añadida a C++ 11. Las otras funciones no son. –

Respuesta

5

Puede construir el rango invertido manualmente usando 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 lo hubiera, sería probablemente el siguiente aspecto:

template< typename iter > 
std::reverse_iterator<iter> reverse(iter i) 
    { return { i }; } 

Armado con esto, usted puede hacer

std::sort(reverse(std::end(my_array)), reverse(std::begin(my_array))); 

En este ejemplo se evita el problema de especificar el comparador std::greater, pero el reverse_iterator posiblemente podría afectar negativamente rendimiento si el compilador no puede eliminar la complejidad añadida de los bucles internos.

7

Para las personas que vean esto más adelante, los no miembros rbegin() y rend() ya están en C++ 14.

+1

¡Sí! http://en.cppreference.com/w/cpp/iterator/rbegin – Johnsyweb

+1

¡Ja! Eso es lo que espero. Porque no puedo ver la sobrecarga de agregar rbegin() basado en la función nonmember de begin(). Abrazo C++ 14! – 8090PZ