名前空間
変種
操作

標準ライブラリヘッダ <ranges>

提供: cppreference.com
< cpp‎ | header
 
 
 

このヘッダは範囲ライブラリの一部です。

目次

[編集] 名前空間エイリアス

ヘッダ <ranges> で定義
namespace std {

    namespace view = ranges::view;

}

std::ranges::view の短縮形として名前空間エイリアス std::view が提供されます。

ヘッダ <ranges> で定義
名前空間 std::ranges で定義
範囲アクセス
範囲の先頭を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の終端を指すイテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲の逆終端イテレータを返します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲プリミティブ
サイズが定数時間で計算可能な範囲のサイズを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲が空かどうか調べます
(カスタマイゼーションポイントオブジェクト) [edit]
隣接範囲の先頭を指すポインタを取得します
(カスタマイゼーションポイントオブジェクト) [edit]
範囲のイテレータおよび番兵の型を取得します
(エイリアステンプレート) [edit]
範囲コンセプト
型が範囲である、つまり、 begin イテレータと end 番兵を提供することを指定します
(コンセプト) [edit]
範囲のサイズを定数時間で取得できることを指定します
(コンセプト) [edit]
範囲がビューである、つまり、コピー/ムーブ/代入が定数時間であることを指定します
(コンセプト) [edit]
イテレータの型が InputIterator を満たす範囲を指定します
(コンセプト) [edit]
イテレータの型が OutputIterator を満たす範囲を指定します
(コンセプト) [edit]
イテレータの型が ForwardIterator を満たす範囲を指定します
(コンセプト) [edit]
イテレータの型が BidirectionalIterator を満たす範囲を指定します
(コンセプト) [edit]
イテレータの型が RandomAccessIterator を満たす範囲を指定します
(コンセプト) [edit]
イテレータの型が ContiguousIterator を満たす範囲を指定します
(コンセプト) [edit]
範囲のイテレータと番兵の型が同一であることを指定します
(コンセプト) [edit]
View に安全に変換可能であるための Range に対する要件を指定します
(コンセプト) [edit]
ビュー
奇妙に再帰したテンプレートパターンを用いた View を定義するためのヘルパークラステンプレート
(クラステンプレート) [edit]
イテレータと番兵の組を結合して View にします
(クラステンプレート) [edit]
アダプタ
Range のすべての要素を含む View
(エイリアステンプレート) (範囲アダプタオブジェクト) [edit]
何らかの他の Range の要素の View
(クラステンプレート) [edit]
述語を満たす Range の要素から構成される View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
各要素に変換関数を適用するシーケンスの View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
初期値を繰り返しインクリメントすることによって生成されるシーケンスから構成される View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の View の最初の N 個の要素から構成される View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
RangeView を平坦化することによって得られるシーケンスから構成される View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
要素を持たない空の View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
指定された値の要素1個を格納する View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の View を区切り文字で分割することによって得られる部分範囲群に対する View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
イテレータとカウントから部分範囲を作成します
(カスタマイゼーションポイントオブジェクト) [edit]
ViewCommonRange に変換します
(クラステンプレート) (範囲アダプタオブジェクト) [edit]
別の双方向ビューの要素を逆順でイテレートする View
(クラステンプレート) (範囲アダプタオブジェクト) [edit]

[編集] 概要

#include <initializer_list>
#include <iterator>
 
namespace std::ranges {
  inline namespace /* unspecified */ {
    // range access
    inline constexpr /* unspecified */ begin = /* unspecified */;
    inline constexpr /* unspecified */ end = /* unspecified */;
    inline constexpr /* unspecified */ cbegin = /* unspecified */;
    inline constexpr /* unspecified */ cend = /* unspecified */;
    inline constexpr /* unspecified */ rbegin = /* unspecified */;
    inline constexpr /* unspecified */ rend = /* unspecified */;
    inline constexpr /* unspecified */ crbegin = /* unspecified */;
    inline constexpr /* unspecified */ crend = /* unspecified */;
 
    inline constexpr /* unspecified */ size = /* unspecified */;
    inline constexpr /* unspecified */ empty = /* unspecified */;
    inline constexpr /* unspecified */ data = /* unspecified */;
    inline constexpr /* unspecified */ cdata = /* unspecified */;
  }
 
  // ranges
  template<class T>
    using iterator_t = decltype(ranges::begin(declval<T&>()));
 
  template<class T>
    using sentinel_t = decltype(ranges::end(declval<T&>()));
 
  template<class T>
    concept Range = /* see definition */;
 
  // sized ranges
  template<class>
    inline constexpr bool disable_sized_range = false;
 
  template<class T>
    concept SizedRange = /* see definition */;
 
  // views
  template<class T>
    inline constexpr bool enable_view = /* see definition */;
 
  struct view_base { };
 
  template<class T>
    concept View = /* see definition */;
 
  // other range refinements
  template<class R, class T>
    concept OutputRange = /* see definition */;
 
  template<class T>
    concept InputRange = /* see definition */;
 
  template<class T>
    concept ForwardRange = /* see definition */;
 
  template<class T>
    concept BidirectionalRange = /* see definition */;
 
  template<class T>
    concept RandomAccessRange = /* see definition */;
 
  template<class T>
    concept ContiguousRange = /* see definition */;
 
  template<class T>
    concept CommonRange = /* see definition */;
 
  template<class T>
    concept ViewableRange = /* see definition */;
 
  // class template view_interface
  template<class D>
    requires is_class_v<D> && Same<D, remove_cv_t<D>>
  class view_interface;
 
  // sub-ranges
  enum class subrange_kind : bool { unsized, sized };
 
  template<Iterator I, Sentinel<I> S = I, subrange_kind K = /* see definition */>
    requires (K == subrange_kind::sized || !SizedSentinel<S, I>)
  class subrange;
 
  // dangling iterator handling
  struct dangling;
 
  template<Range R>
    using safe_iterator_t = conditional_t<__ForwardingRange<R>, iterator_t<R>, dangling>;
 
  template<Range R>
    using safe_subrange_t =
      conditional_t<__ForwardingRange<R>, subrange<iterator_t<R>>, dangling>;
 
  // empty view
  template<class T>
    requires is_object_v<T>
  class empty_view;
 
  namespace view {
    template<class T>
      inline constexpr empty_view<T> empty{};
  }
 
  // single view
  template<CopyConstructible T>
    requires is_object_v<T>
  class single_view;
 
  namespace view { inline constexpr /* unspecified */ single = /* unspecified */; }
 
  // iota view
  template<WeaklyIncrementable W, Semiregular Bound = unreachable_sentinel_t>
    requires __WeaklyEqualityComparableWith<W, Bound>
  class iota_view;
 
  namespace view { inline constexpr /* unspecified */ iota = /* unspecified */; }
 
  // all view
  namespace view { inline constexpr /* unspecified */ all = /* unspecified */; }
 
  template<ViewableRange R>
    using all_view = decltype(view::all(declval<R>()));
 
  template<Range R>
    requires is_object_v<R>
  class ref_view;
 
  // filter view
  template<InputRange V, IndirectUnaryPredicate<iterator_t<V>> Pred>
    requires View<V> && is_object_v<Pred>
  class filter_view;
 
  namespace view { inline constexpr /* unspecified */ filter = /* unspecified */; }
 
  // transform view
  template<InputRange V, CopyConstructible F>
    requires View<V> && is_object_v<F> &&
             RegularInvocable<F&, iter_reference_t<iterator_t<V>>>
  class transform_view;
 
  namespace view { inline constexpr /* unspecified */ transform = /* unspecified */; }
 
  // take view
  template<View> class take_view;
 
  namespace view { inline constexpr /* unspecified */ take = /* unspecified */; }
 
  // join view
  template<InputRange V>
    requires View<V> && InputRange<iter_reference_t<iterator_t<V>>> &&
             (is_reference_v<iter_reference_t<iterator_t<V>>> ||
              View<iter_value_t<iterator_t<V>>>)
  class join_view;
 
  namespace view { inline constexpr /* unspecified */ join = /* unspecified */; }
 
  // split view
  template<class R>
    concept __TinyRange = /* see definition */;   // exposition only
 
  template<InputRange V, ForwardRange Pattern>
    requires View<V> && View<Pattern> &&
             IndirectlyComparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
             (ForwardRange<V> || __TinyRange<Pattern>)
  class split_view;
 
  namespace view { inline constexpr /* unspecified */ split = /* unspecified */; }
 
  // counted view
  namespace view { inline constexpr /* unspecified */ counted = /* unspecified */; }
 
  // common view
  template<View V>
    requires (!CommonRange<V>)
  class common_view;
 
  namespace view { inline constexpr /* unspecified */ common = /* unspecified */; }
 
  // reverse view
  template<View V>
    requires BidirectionalRange<V>
  class reverse_view;
 
  namespace view { inline constexpr /* unspecified */ reverse = /* unspecified */; }
}
 
namespace std {
  namespace view = ranges::view;
 
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_size<ranges::subrange<I, S, K>>
    : integral_constant<size_t, 2> {};
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<0, ranges::subrange<I, S, K>> {
    using type = I;
  };
  template<class I, class S, ranges::subrange_kind K>
  struct tuple_element<1, ranges::subrange<I, S, K>> {
    using type = S;
  };
}

[編集] コンセプト Range

namespace std::ranges {
  template<class T>
    concept __RangeImpl =          // exposition only
      requires(T&& t) {
        ranges::begin(std::forward<T>(t));// sometimes equality-preserving (see definition)
        ranges::end(std::forward<T>(t));
      };
 
  template<class T>
    concept Range = __RangeImpl<T&>;
 
  template<class T>
    concept __ForwardingRange =    // exposition only
      Range<T> && __RangeImpl<T>;
}

[編集] コンセプト SizedRange

namespace std::ranges {
  template<class T>
    concept SizedRange =
      Range<T> &&
      !disable_sized_range<remove_cvref_t<T>> &&
      requires(T& t) { ranges::size(t); };
}

[編集] コンセプト View

namespace std::ranges {
  template<class T>
    inline constexpr bool enable_view = /* see definition */;
 
  template<class T>
    concept View =
      Range<T> && Semiregular<T> && enable_view<T>;
}


[編集] コンセプト OutputRange

namespace std::ranges {
  template<class R, class T>
    concept OutputRange =
      Range<R> && OutputIterator<iterator_t<R>, T>;
}

[編集] コンセプト InputRange

namespace std::ranges {
  template<class T>
    concept InputRange =
      Range<T> && InputIterator<iterator_t<T>>;
}

[編集] コンセプト ForwardRange

namespace std::ranges {
  template<class T>
    concept ForwardRange =
      InputRange<T> && ForwardIterator<iterator_t<T>>;
}

[編集] コンセプト BidirectionalRange

namespace std::ranges {
  template<class T>
    concept BidirectionalRange =
      ForwardRange<T> && BidirectionalIterator<iterator_t<T>>;
}

[編集] コンセプト RandomAccessRange

namespace std::ranges {
  template<class T>
    concept RandomAccessRange =
      BidirectionalRange<T> && RandomAccessIterator<iterator_t<T>>;
}

[編集] コンセプト ContiguousRange

namespace std::ranges {
  template<class T>
    concept ContiguousRange =
     RandomAccessRange<T> && ContiguousIterator<iterator_t<T>> &&
      requires(T& t) {
        { ranges::data(t) } -> Same<add_pointer_t<iter_reference_t<iterator_t<T>>>>;
      };
}

[編集] コンセプト CommonRange

namespace std::ranges {
  template<class T>
    concept CommonRange =
      Range<T> && Same<iterator_t<T>, sentinel_t<T>>;
}

[編集] コンセプト ViewableRange

namespace std::ranges {
  template<class T>
    concept ViewableRange =
      Range<T> && (__ForwardingRange<T> || View<decay_t<T>>);
}

[編集] ヘルパーコンセプト

namespace std::ranges { // unspecified, for name lookup only
  template<class R>
    concept __SimpleView =                        // exposition only
      View<R> && Range<const R> &&
      Same<iterator_t<R>, iterator_t<const R>> &&
      Same<sentinel_t<R>, sentinel_t<const R>>;
 
  template<InputIterator I>
    concept __HasArrow =                          // exposition only
      is_pointer_v<I> || requires(I i) { i.operator->(); };
 
  template<class T, class U>
    concept __NotSameAs =                         // exposition only
      !Same<remove_cvref_t<T>, remove_cvref_t<U>>;
}

ノート: これらの名前は説明専用であり、インタフェースの一部ではありません。

[編集] クラス std::ranges::view_interface

namespace std::ranges {
  template<class D>
    requires is_class_v<D> && Same<D, remove_cv_t<D>>
  class view_interface : public view_base {
  private:
    constexpr D& derived() noexcept {                   // exposition only
      return static_cast<D&>(*this);
    }
    constexpr const D& derived() const noexcept {       // exposition only
      return static_cast<const D&>(*this);
    }
  public:
    constexpr bool empty() requires ForwardRange<D> {
      return ranges::begin(derived()) == ranges::end(derived());
    }
    constexpr bool empty() const requires ForwardRange<const D> {
      return ranges::begin(derived()) == ranges::end(derived());
    }
 
    constexpr explicit operator bool()
      requires requires { ranges::empty(derived()); } {
        return !ranges::empty(derived());
      }
    constexpr explicit operator bool() const
      requires requires { ranges::empty(derived()); } {
        return !ranges::empty(derived());
      }
 
    constexpr auto data() requires ContiguousIterator<iterator_t<D>> {
      return ranges::empty(derived()) ? nullptr : addressof(*ranges::begin(derived()));
    }
    constexpr auto data() const
      requires Range<const D> && ContiguousIterator<iterator_t<const D>> {
        return ranges::empty(derived()) ? nullptr : addressof(*ranges::begin(derived()));
      }
 
    constexpr auto size() requires ForwardRange<D> &&
      SizedSentinel<sentinel_t<D>, iterator_t<D>> {
        return ranges::end(derived()) - ranges::begin(derived());
      }
    constexpr auto size() const requires ForwardRange<const D> &&
      SizedSentinel<sentinel_t<const D>, iterator_t<const D>> {
        return ranges::end(derived()) - ranges::begin(derived());
      }
 
    constexpr decltype(auto) front() requires ForwardRange<D>;
    constexpr decltype(auto) front() const requires ForwardRange<const D>;
 
    constexpr decltype(auto) back() requires BidirectionalRange<D> && CommonRange<D>;
    constexpr decltype(auto) back() const
      requires BidirectionalRange<const D> && CommonRange<const D>;
 
    template<RandomAccessRange R = D>
      constexpr decltype(auto) operator[](iter_difference_t<iterator_t<R>> n) {
        return ranges::begin(derived())[n];
      }
    template<RandomAccessRange R = const D>
      constexpr decltype(auto) operator[](iter_difference_t<iterator_t<R>> n) const {
        return ranges::begin(derived())[n];
      }
  };
}

[編集] クラス std::ranges::subrange

namespace std::ranges {
  template<class T>
    concept __PairLike =                                // exposition only
      !is_reference_v<T> && requires(T t) {
        typename tuple_size<T>::type;   // ensures tuple_­size<T> is complete
        requires DerivedFrom<tuple_size<T>, integral_constant<size_t, 2>>;
        typename tuple_element_t<0, remove_const_t<T>>;
        typename tuple_element_t<1, remove_const_t<T>>;
        { get<0>(t) } -> const tuple_element_t<0, T>&;
        { get<1>(t) } -> const tuple_element_t<1, T>&;
      };
 
  template<class T, class U, class V>
    concept __PairLikeConvertibleTo =                   // exposition only
      !Range<T> && __PairLike<remove_reference_t<T>> &&
      requires(T&& t) {
        { get<0>(std::forward<T>(t)) } -> ConvertibleTo<U>;
        { get<1>(std::forward<T>(t)) } -> ConvertibleTo<V>;
      };
 
  template<class T, class U, class V>
    concept __PairLikeConvertibleFrom =                 // exposition only
      !Range<T> && __PairLike<T> && Constructible<T, U, V>;
 
  template<class T>
    concept __IteratorSentinelPair =                    // exposition only
      !Range<T> && __PairLike<T> &&
      Sentinel<tuple_element_t<1, T>, tuple_element_t<0, T>>;
 
  template<Iterator I, Sentinel<I> S = I, subrange_kind K =
      SizedSentinel<S, I> ? subrange_kind::sized : subrange_kind::unsized>
    requires (K == subrange_kind::sized || !SizedSentinel<S, I>)
  class subrange : public view_interface<subrange<I, S, K>> {
  private:
    static constexpr bool StoreSize =                   // exposition only
      K == subrange_kind::sized && !SizedSentinel<S, I>;
    I begin_ = I();                                     // exposition only
    S end_ = S();                                       // exposition only
    iter_difference_t<I> size_ = 0;                     // exposition only; present only
                                                        // when StoreSize is true
  public:
    subrange() = default;
 
    constexpr subrange(I i, S s) requires (!StoreSize);
 
    constexpr subrange(I i, S s, iter_difference_t<I> n)
      requires (K == subrange_kind::sized);
 
    template<__NotSameAs<subrange> R>
      requires __ForwardingRange<R> &&
        ConvertibleTo<iterator_t<R>, I> && ConvertibleTo<sentinel_t<R>, S>
    constexpr subrange(R&& r) requires (!StoreSize || SizedRange<R>);
 
    template<__ForwardingRange R>
      requires ConvertibleTo<iterator_t<R>, I> && ConvertibleTo<sentinel_t<R>, S>
    constexpr subrange(R&& r, iter_difference_t<I> n)
      requires (K == subrange_kind::sized)
        : subrange{ranges::begin(r), ranges::end(r), n}
    {}
 
    template<__NotSameAs<subrange> PairLike>
      requires __PairLikeConvertibleTo<PairLike, I, S>
    constexpr subrange(PairLike&& r) requires (!StoreSize)
      : subrange{std::get<0>(std::forward<PairLike>(r)),
                 std::get<1>(std::forward<PairLike>(r))}
    {}
 
    template<__PairLikeConvertibleTo<I, S> PairLike>
    constexpr subrange(PairLike&& r, iter_difference_t<I> n)
      requires (K == subrange_kind::sized)
      : subrange{std::get<0>(std::forward<PairLike>(r)),
                 std::get<1>(std::forward<PairLike>(r)), n}
    {}
 
    template<__NotSameAs<subrange> PairLike>
      requires __PairLikeConvertibleFrom<PairLike, const I&, const S&>
    constexpr operator PairLike() const;
 
    constexpr I begin() const;
    constexpr S end() const;
 
    constexpr bool empty() const;
    constexpr iter_difference_t<I> size() const
      requires (K == subrange_kind::sized);
 
    [[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) const;
    [[nodiscard]] constexpr subrange prev(iter_difference_t<I> n = 1) const
      requires BidirectionalIterator<I>;
    constexpr subrange& advance(iter_difference_t<I> n);
 
    friend constexpr I begin(subrange&& r) { return r.begin(); }
    friend constexpr S end(subrange&& r) { return r.end(); }
  };
 
  template<Iterator I, Sentinel<I> S>
    subrange(I, S, iter_difference_t<I>) -> subrange<I, S, subrange_kind::sized>;
 
  template<__IteratorSentinelPair P>
    subrange(P) -> subrange<tuple_element_t<0, P>, tuple_element_t<1, P>>;
 
  template<__IteratorSentinelPair P>
    subrange(P, iter_difference_t<tuple_element_t<0, P>>) ->
      subrange<tuple_element_t<0, P>, tuple_element_t<1, P>, subrange_kind::sized>;
 
  template<__ForwardingRange R>
    subrange(R&&) ->
      subrange<iterator_t<R>, sentinel_t<R>,
               (SizedRange<R> || SizedSentinel<sentinel_t<R>, iterator_t<R>>)
                 ? subrange_kind::sized : subrange_kind::unsized>;
 
  template<__ForwardingRange R>
    subrange(R&&, iter_difference_t<iterator_t<R>>) ->
      subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>;
 
  template<size_t N, class I, class S, subrange_kind K>
    requires (N < 2)
  constexpr auto get(const subrange<I, S, K>& r);
}
 
namespace std {
  using ranges::get;
}

[編集] クラス std::ranges::dangling

namespace std::ranges {
  struct dangling {
    constexpr dangling() noexcept = default;
    template<class... Args>
      constexpr dangling(Args&&...) noexcept { }
  };
}

[編集] クラス std::ranges::ref_view

namespace std::ranges {
  template<Range R>
    requires is_object_v<R>
  class ref_view : public view_interface<ref_view<R>> {
  private:
    R* r_ = nullptr;            // exposition only
  public:
    constexpr ref_view() noexcept = default;
 
    template<__NotSameAs<ref_view> T>
      requires /* see definition */
    constexpr ref_view(T&& t);
 
    constexpr R& base() const { return *r_; }
 
    constexpr iterator_t<R> begin() const { return ranges::begin(*r_); }
    constexpr sentinel_t<R> end() const { return ranges::end(*r_); }
 
    constexpr bool empty() const
      requires requires { ranges::empty(*r_); }
    { return ranges::empty(*r_); }
 
    constexpr auto size() const requires SizedRange<R>
    { return ranges::size(*r_); }
 
    constexpr auto data() const requires ContiguousRange<R>
    { return ranges::data(*r_); }
 
    friend constexpr iterator_t<R> begin(ref_view r)
    { return r.begin(); }
 
    friend constexpr sentinel_t<R> end(ref_view r)
    { return r.end(); }
  };
  template<class R>
    ref_view(R&) -> ref_view<R>;
}