为(自动我:C) – 是否有一个简短的方法做反向?

我有一个自定义的容器类和定义的迭代器,所以我可以这样做:

for (auto i : c) 

但有什么东西可以反向迭代吗?

就像是:

 for_reverse (auto i : c) 
  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)) ... 
  2. 你可以使用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)) ... 

一次性的痛苦

 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(rtrbegin()) { return rtrbegin(); } template <class T> auto end(details::_reversed<T>& r) -> decltype(rtrend()) { return rtrend(); } 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)) ...