for(auto i : c) -- Is there a short way to do it in reverse direction?

c++

Solution

You can use boost:

#include <boost/range/adaptor/reversed.hpp>

using namespace boost::adaptors;
for (auto i : c | reversed)
    ...

Or if you don't like operator overloading:

#include <boost/range/adaptor/reversed.hpp>

using namespace boost::adaptors;
for (auto i : reverse(c))
    ...

You can define a similar helper function using std::reverse_iterator so you don't depend on 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)));
}

Then you can write:

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

Example

Problem

I have a custom container class and defined iterators, so I can do: ``` for (auto i : c) ``` but is there something to iterate in reverse direction? Something like: ``` for_reverse (auto i : c) ```

Original source