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

For (auto i: c) - Есть ли короткий способ сделать это в обратном направлении?

У меня есть собственный класс контейнера и определенные итераторы, поэтому я могу сделать:

for (auto i : c)

но есть ли что-то, чтобы итерации в обратном направлении?

Что-то вроде:

for_reverse (auto i : c)
4b9b3361

Ответ 1

  • Вы можете использовать boost:

    #include <boost/range/adaptor/reversed.hpp>
    
    using namespace boost::adaptors;
    for (auto i : c | reversed)
        ...
    

    Или, если вам не нравится перегрузка оператора:

    #include <boost/range/adaptor/reversed.hpp>
    
    using namespace boost::adaptors;
    for (auto i : reverse(c))
        ...
    
  • Вы можете определить аналогичную вспомогательную функцию, используя std:: reverse_iterator, чтобы вы не зависели от boost:

    template<typename It>
    class Range
    {
        It b, e;
    public:
        Range(It b, It e) : b(b), e(e) {}
        It begin() const { return b; }
        It end() const { return e; }
    };
    
    template<typename ORange, typename OIt = decltype(std::begin(std::declval<ORange>())), typename It = std::reverse_iterator<OIt>>
    Range<It> reverse(ORange && originalRange) {
        return Range<It>(It(std::end(originalRange)), It(std::begin(originalRange)));
    }
    

    Затем вы можете написать:

    for (auto i : reverse(c))
        ...
    

    Пример

Ответ 2

Одноразовая боль

namespace details {
    template <class T> struct _reversed { T& t; _reversed(T& _t): t(_t) {} };
}

template <class T> details::_reversed<T> reversed(T& t) { return details::_reversed<T>(t); }
template <class T> details::_reversed<T const> reversed(T const& t) { return details::_reversed<T const>(t); }

namespace std {
    template <class T> auto begin(details::_reversed<T>& r) -> decltype(r.t.rbegin()) { return r.t.rbegin(); }
    template <class T> auto end(details::_reversed<T>& r) -> decltype(r.t.rend()) { return r.t.rend(); }

    template <class T> auto begin(details::_creversed<T> const& cr) -> decltype(cr.t.rbegin()) { return cr.t.rbegin(); }
    template <class T> auto end(details::_creversed<T> const& cr) -> decltype(cr.t.rend()) { return cr.t.rend(); }
}

а затем вы можете сделать ниже

for (auto x: reversed(c)) ...