std::ranges::views::enumerate, std::ranges::enumerate_view
From cppreference.com
| ヘッダ <ranges> で定義 |
||
| template< ranges::view V > requires /*range-with-movable-references*/<V> |
(1) | (C++23から) |
| namespace views { inline constexpr /* unspecified */ enumerate = /* unspecified */; |
(2) | (C++23から) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R > requires /* 以下を参照 */ |
(C++23から) | |
| ヘルパーコンセプト |
||
| template< class R > concept /*range-with-movable-references*/ = |
(3) | (説明用*) |
1)
enumerate_view は、view を受け取り、tuple のビューを生成するレンジアダプターです。結果のシーケンスの i番目の要素(タプル)は、以下を保持します。- 基底シーケンスの要素の0ベースのインデックスである
iと等しい値、および - 基底要素への参照。
2)
views::enumerate という名前は、RangeAdaptorObject を示します。サブ式 e が与えられた場合、式 views::enumerate(e) は、適切なサブ式 e に対して enumerate_view<views::all_t<decltype((e))>>(e) と式的に等価です。3) 基底型の参照型が移動可能であることを保証します。
基底ビュー V がそれぞれの概念をモデル化する場合、enumerate_view は random_access_range、bidirectional_range、forward_range、input_range、common_range、および sized_range の概念をモデル化します。
目次 |
[編集] データメンバ
| メンバ名 | 定義 |
base_ (プライベート) |
型 V の基底シーケンスへのイテレータ。(説明用のメンバオブジェクト*) |
[編集] メンバ関数
enumerate_view を構築する(public メンバ関数) | |
| 基になる(適応された)ビューのコピーを返す (public member function) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (public メンバ関数) | |
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す(public メンバ関数) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが 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++23) |
イテレータ型 (説明専用メンバクラステンプレート*) |
| (C++23) |
センチネル型 (説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class View > constexpr bool enable_borrowed_range<ranges::enumerate_view<View>> = |
(C++23から) | |
ranges::enable_borrowed_range のこの特殊化により、基底ビューが borrowed_range を満たす場合、enumerate_view も borrowed_range を満たします。
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_ranges_enumerate |
202302L |
(C++23) | std::ranges::enumerate_view
|
[編集] 例
このコードを実行
#include <iostream> #include <map> #include <ranges> #include <vector> int main() { constexpr static auto v = {'A', 'B', 'C', 'D'}; for (auto const [index, letter] : std::views::enumerate(v)) std::cout << '(' << index << ':' << letter << ") "; std::cout << '\n'; #if __cpp_lib_ranges_to_container // create a map using the position of each element as key auto m = v | std::views::enumerate | std::ranges::to<std::map>(); for (auto const [key, value] : m) std::cout << '[' << key << "]:" << value << ' '; std::cout << '\n'; #endif std::vector<int> numbers{1, 3, 5, 7}; // num is mutable even with const, which does not propagate to reference to // make it const, use `std::views::enumerate(numbers) | std::views::as_const` // or `std::views::enumerate(std::as_const(numbers))` for (auto const [index, num] : std::views::enumerate(numbers)) { ++num; // the type is int& std::cout << numbers[index] << ' '; } std::cout << '\n'; }
実行結果の例
(0:A) (1:B) (2:C) (3:D) [0]:A [1]:B [2]:C [3]:D 2 4 6 8
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 26.7.23 Enumerate view [range.enumerate]
[編集] 関連項目
| (C++20) |
初期値を繰り返しインクリメントして生成されるシーケンスからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
| (C++23) |
適合するviewの対応する要素への参照のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
tuple-like な値からなるviewと数値Nを取り、各タプルのN番目の要素のviewを生成する(クラステンプレート) (rangeアダプタオブジェクト) |