Namespaces
Variants

std::ranges:: subrange

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <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*/ =

/* 説明を参照 */ ;
(2) ( 説明専用* )
template < class From, class To >
concept /*convertible-to-non-slicing*/ = /* 説明を参照 */ ;
(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_
( StoreSize true の場合のみ存在)
サブレンジのサイズ
( 説明専用メンバーオブジェクト* )

メンバー関数

新しい subrange を作成する
(public member function)
subrange pair-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)
範囲の先頭を指す定数イテレータを返す
(public member function of std::ranges::view_interface<D> )
(C++23)
範囲の定数イテレータ用のセンチネルを返す
(public member function of std::ranges::view_interface<D> )
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合のみ提供)
(public member function of std::ranges::view_interface<D> )
派生ビューのデータのアドレスを取得する(そのイテレータ型が contiguous_iterator を満たす場合のみ提供)
(public member function of std::ranges::view_interface<D> )
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
(public member function of std::ranges::view_interface<D> )
派生ビューの最後の要素を返す( bidirectional_range および common_range を満たす場合のみ提供)
(public member function of std::ranges::view_interface<D> )
派生ビューの n 番目 の要素を返す( random_access_range を満たす場合のみ提供)
(public member function of std::ranges::view_interface<D> )

推論ガイド

非メンバー関数

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

ヘルパー型

std::ranges::subrange std::ranges::sized_range をモデル化するかどうかを指定する
(列挙型)
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 の特殊化は、 subrange borrowed_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 が修飾変換を拒否する可能性がある 常にそれらを受け入れる

関連項目

view を定義するためのヘルパークラステンプレート。 奇妙に再帰したテンプレートパターン を使用する
(クラステンプレート)

外部リンク

C++20で特定のキーを持つ std::multimap の全値を読み書きする — SO