std::ranges::subrange
From cppreference.com
| ヘッダ <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*/ = /* 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_( 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) |
範囲の先頭への定数イテレータを返す ( 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_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論ガイド
[編集] 非メンバ関数
| (C++20) |
std::ranges::subrange からイテレータまたはセンチネルを取得します。 (関数テンプレート) |
[編集] ヘルパー型
| (C++20) |
std::ranges::subrange が std::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 の特殊化により、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) |
CRTP (Curiously Recurring Template Pattern) を使用してviewを定義するためのヘルパークラステンプレート(クラステンプレート) |
[編集] 外部リンク
C++20で指定されたキーを持つstd::multimapのすべての値を読み書きする — SO |