名前空間
変種
操作

std::ranges::subrange

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
表示
subrange

Rangeアダプタ
 
 
ヘッダ <ranges> で定義
template<

    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
                                  ranges::subrange_kind::sized :
                                  ranges::subrange_kind::unsized
>
    requires (K == ranges::subrange_kind::sized ||
                 !std::sized_sentinel_for<S, I>)
class subrange

    : public ranges::view_interface<subrange<I, S, K>>
(1) (C++20以降)
ヘルパーコンセプト
template<class From, class To>

concept /*uses-nonqualification-pointer-conversion*/ =

    /* see description */;
(2) (説明用*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
(3) (説明用*)
1) subrange クラステンプレートは、イテレータとセンチネルを組み合わせて単一の view を形成します。 最終テンプレートパラメータが subrange_kind::sized である場合(std::sized_sentinel_for<S, I> が満たされる場合、またはサイズがコンストラクタ引数として明示的に渡された場合)、sized_range をモデル化します。
2) From修飾変換なしで To に変換可能かどうかを決定します。 次と同等です。
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) From が派生クラスから基底クラスへの変換なしで To に変換可能かどうかを決定します。
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

目次

[編集] データメンバー

メンバ 定義
constexpr bool StoreSize [static] K == ranges::subrange_kind::sized &&
    !std::sized_sentinel_for<S, I>

((実装専用静的メンバ定数*))
I begin_ サブレンジの開始位置へのイテレータ
(説明用のメンバオブジェクト*)
S end_ サブレンジの終了を示すセンチネル
(説明用のメンバオブジェクト*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(StoreSizetrue の場合にのみ存在)
サブレンジのサイズ
(説明用のメンバオブジェクト*)

[編集] メンバ関数

新しい subrange を作成します。
(public member function)
subrangepair-like 型に変換します。
(public member function) [編集]
監視
イテレータを取得します。
(public member function) [編集]
センチネルを取得します。
(public member function) [編集]
subrange が空かどうかをチェックします。
(public member function) [編集]
subrange のサイズを取得します。
(public member function) [編集]
イテレータ操作
指定された距離だけイテレータを進めます。
(public member function) [編集]
イテレータを指定された距離だけ前に進めた subrange のコピーを取得します。
(public member function) [編集]
イテレータを指定された距離だけ進めた subrange のコピーを取得します。
(public member function) [編集]
std::ranges::view_interface から継承
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
イテレータ型が contiguous_iterator を満たす場合にのみ、派生ビューのデータのアドレスを取得する
(std::ranges::view_interface<D> の公開メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[編集] 推論ガイド

[編集] 非メンバ関数

std::ranges::subrange からイテレータまたはセンチネルを取得します。
(関数テンプレート) [編集]

[編集] ヘルパー型

std::ranges::subrangestd::ranges::sized_range をモデル化するかどうかを指定します。
(enum) [編集]
std::ranges::subrange のサイズを取得します。
(クラステンプレート特殊化) [編集]
std::ranges::subrange のイテレータまたはセンチネルの型を取得します。
(クラステンプレート特殊化) [編集]

[編集] ヘルパーテンプレート

template< class I, class S, ranges::subrange_kind K >
constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true;
(C++20以降)

この ranges::enable_borrowed_range の特殊化により、subrangeborrowed_range を満たします。

[編集]

#include <map>
#include <print>
#include <ranges>
 
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
 
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
 
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

出力

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3470 C++20 convertible-to-non-slicing は修飾変換を拒否する可能性があります。 常にそれらを受け入れます。

[編集] 関連項目

CRTP (Curiously Recurring Template Pattern) を使用してviewを定義するためのヘルパークラステンプレート
(クラステンプレート) [編集]

[編集] 外部リンク

C++20で指定されたキーを持つstd::multimapのすべての値を読み書きする — SO
English 日本語 中文(简体) 中文(繁體)