Namespaces
Variants

std::ranges:: views:: enumerate, std::ranges:: enumerate_view

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: view V >

requires /*range-with-movable-references*/ < V >
class enumerate_view

: public ranges:: view_interface < enumerate_view < V >>
(1) (C++23以降)
namespace views {

inline constexpr /* 未規定 */ enumerate = /* 未規定 */ ;

}
(2) (C++23以降)
呼び出しシグネチャ
template < ranges:: viewable_range R >

requires /* 下記参照 */

constexpr /* 下記参照 */ enumerate ( R && r ) ;
(C++23以降)
ヘルパーコンセプト
template < class R >

concept /*range-with-movable-references*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(3) ( 説明専用* )
1) enumerate_view は、 view を受け取り、 tuple のビューを生成するレンジアダプタです。 結果のシーケンスの i th 要素(タプル)は以下を保持します:
  • 基底シーケンスの要素の0から始まるインデックスである i と等しい値、および
  • 基底要素への参照。
2) 名前 views::enumerate RangeAdaptorObject を表す。部分式 e が与えられたとき、式 views :: enumerate ( e ) 式等価 である enumerate_view < views:: all_t < decltype ( ( e ) ) >> ( e ) に、任意の適切な部分式 e に対して。
3) 基になる型の参照型が移動可能であることを保証します。

enumerate_view は、基となるビュー V がそれぞれのコンセプトをモデル化する場合、 random_access_range bidirectional_range forward_range input_range common_range 、および sized_range のコンセプトをモデル化します。

目次

データメンバ

メンバー 説明
V base_ 基となる view へのイテレータ
( 説明専用メンバーオブジェクト* )

メンバー関数

enumerate_view を構築する
(public member function)
基となる(アダプトされた)ビューのコピーを返す
(public member function)
先頭を指すイテレータを返す
(public member function)
終端を指すイテレータまたはセンチネルを返す
(public member function)
要素数を返す(基となる(アダプトされた)範囲が sized_range を満たす場合にのみ提供)
(public member function)
結果の approximately_sized_range の近似サイズを返す
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の定数イテレータのセンチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最初の要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最後の要素を返す( bidirectional_range かつ common_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの n th 番目の要素を返す( random_access_range を満たす場合にのみ提供)
( std::ranges::view_interface<D> のpublic member function)

推論ガイド

ネストされたクラス

(C++23)
イテレータ型
( 説明専用メンバクラステンプレート* )
(C++23)
センチネル型
( 説明専用メンバクラステンプレート* )

ヘルパーテンプレート

template < class View >

constexpr bool enable_borrowed_range < ranges :: enumerate_view < View >> =

ranges:: enable_borrowed_range < View > ;
(C++23以降)

この ranges::enable_borrowed_range の特殊化は、基となるビューが borrowed_range を満たす場合に、 enumerate_view がそれを満たすようにします。

注記

機能テスト マクロ 標準 機能
__cpp_lib_ranges_enumerate 202302L (C++23) std::ranges::enumerate_view

#include <initializer_list>
#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
    // 各要素の位置をキーとしてmapを作成
    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};
    // constでもnumは変更可能(constは参照先に伝播しない)
    // constにするには `std::views::enumerate(numbers) | std::views::as_const`
    // または `std::views::enumerate(std::as_const(numbers))` を使用
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // 型は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]

関連項目

初期値を繰り返しインクリメントして生成されるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
適応されたビューの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)
tuple-like 値からなる view と数値Nを受け取り、各タプルのN th 要素からなる view を生成する
(クラステンプレート) (レンジアダプタオブジェクト)