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) ```