for(auto i : c) -- 逆方向に実行する簡単な方法はありますか? 質問する

for(auto i : c) -- 逆方向に実行する簡単な方法はありますか? 質問する

カスタム コンテナ クラスと定義済みのイテレータがあるので、次の操作を実行できます。

for (auto i : c)

しかし、逆方向に反復するものはありますか?

何かのようなもの:

for_reverse (auto i : c)

ベストアンサー1

  1. ブーストを使用できます:

    #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ブーストに依存しないようにします。

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

おすすめ記事