Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
152 views
in Technique[技术] by (71.8m points)

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

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)
question from:https://stackoverflow.com/questions/21510091/forauto-i-c-is-there-a-short-way-to-do-it-in-reverse-direction

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
  1. 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))
        ...
    
  2. 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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...