std::ranges:: subrange
|
ヘッダーで定義
<ranges>
|
||
|
template
<
std::
input_or_output_iterator
I,
|
(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) | ( 説明専用* ) |
subrange
クラステンプレートは、イテレータとセンチネルを単一の
view
に結合します。これは、最終テンプレートパラメータが
subrange_kind
::
sized
である場合(
std::
sized_sentinel_for
<
S, I
>
が満たされる場合、またはコンストラクタ引数として明示的にサイズが渡される場合)に
sized_range
をモデル化します。
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>(*)[]>;
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>
)
|
|
推論ガイド
非メンバー関数
|
(C++20)
|
std::ranges::subrange
からイテレータまたはセンチネルを取得する
(関数テンプレート) |
ヘルパー型
|
(C++20)
|
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
が修飾変換を拒否する可能性がある
|
常にそれらを受け入れる |
関連項目
|
(C++20)
|
view
を定義するためのヘルパークラステンプレート。
奇妙に再帰したテンプレートパターン
を使用する
(クラステンプレート) |
外部リンク
C++20で特定のキーを持つ
std::multimap
の全値を読み書きする
— SO
|