Подтвердить что ты не робот

С++ 11: Функции nonbember rbegin()/rend()

Так как функции nonmember begin() и end() были добавлены для стандартного содержимого в версии С++ 11, почему не были добавлены несимвольные версии функций rbegin() и rend()? Я чувствую себя глупо, после того, как начал использовать версии, не относящиеся к begin() и end(), только для того, чтобы найти, что мне теперь нужно переключаться между использованием функций-членов и не-членов функций. (Я понимаю, что было бы тривиально сворачивать мои собственные невольные версии rbegin() и rend(), но мне интересно, почему это не было добавлено к стандарту).

Спасибо за ваш вклад.

4b9b3361

Ответ 1

Вы можете построить обратный диапазон вручную, используя std::reverse_iterator по результатам std::begin и std::end.

Как ни странно, для reverse_iterator нет стандартной функции factory. Если бы это было возможно, это выглядело бы так:

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

Вооружившись этим, вы можете сделать

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

В этом примере не удается определить компаратор std::greater, но reverse_iterator предположительно может отрицательно повлиять на производительность, если компилятор не сможет удалить добавленную сложность из внутренних циклов.

Ответ 2

Для людей, которые видят это позже, nonmember rbegin() и rend() уже находятся в С++ 14.