最終更新日時: 2026年05月21日 15時03分06秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<ranges>

# std::ranges::transform_view(C++20)

    namespace std::ranges {
      template<input_range V, copy_constructible F>
        requires view<V> && is_object_v<F> &&
                 regular_invocable<F&, range_reference_t<V>> &&
                 can-reference<invoke_result_t<F&, range_reference_t<V>>>
      class transform_view : public view_interface<transform_view<R>> { …… }; // (1) C++20

      template<input_range V, move_constructible F>
        requires view<V> && is_object_v<F> &&
                 regular_invocable<F&, range_reference_t<V>> &&
                 can-reference<invoke_result_t<F&, range_reference_t<V>>>
      class transform_view : public view_interface<transform_view<R>> { …… }; // (1) C++23

      namespace views {
        inline constexpr /*unspecified*/ transform = /*unspecified*/;         // (2)
      }
    }

## 概要

- (1): 指定した関数で各要素を変換した値のRangeとして振る舞う`view`
- (2): `transform_view`を生成するRangeアダプタオブジェクト

### Rangeコンセプト

borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
| (1) | (2) | ○ | (1) | (1) | (1) |  | (1) | ○ | ○

- (1): `V`に従う
- (2): 述語が参照を返す場合

## 効果

- (2): 式`views::transform(E, P)`の効果は`transform_view(E, P)`と等しい

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`base` | `V`の参照を取得する | C++20
`begin` | 先頭を指すイテレータを取得する | C++20
`end` | 番兵を取得する | C++20
`size` | 要素数を取得する | C++20
`reserve_hint` | 要素数の近似値を取得する | C++26

`r`を元のRangeとする。`size`は`ranges::size(r)`が有効な式であるときに定義される。

## 継承しているメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | Rangeが空かどうかを判定する | C++20
`operator bool` | Rangeが空でないかどうかを判定する | C++20
`front` | 先頭要素への参照を取得する | C++20
`back` | 末尾要素への参照を取得する | C++20
`operator[]` | 要素へアクセスする | C++20
`cbegin` | 定数イテレータを取得する | C++23
`cend` | 定数イテレータ（番兵）を取得する | C++23

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`template <bool Const> iterator;` | イテレータ型(説明専用) | C++20
`template <bool Const> sentinel;` | 番兵型(説明専用) | C++20

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++20

## 例

    #include <ranges>
    #include <iostream>

    int main() {
      using namespace std;
      int a[] = {1, 2, 3};

      for (int i : a | views::transform([](int x){ return x * x; })) {
        cout << i;
      }
    }

### 出力

    149

## 例 特定のメンバを選択する

    #include <ranges>
    #include <string>
    #include <iostream>

    struct Record {
      int id = 0;
      std::string name;
    };

    int main() {
      using namespace std;
      Record records[] = {
        {1, "Alice"},
        {2, "Bob"},
        {3, "Charlie"}
      };

      for (int id : records | views::transform(&Record::id)) {
        cout << id << '\n';
      }
    }

### 出力

    1
    2
    3

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 関連項目

- `std::transform`, `std::ranges::transform`: Rangeの要素に先行評価で関数を適用する標準アルゴリズム関数
- `zip_transform_view` : 複数の範囲から要素を取り出し、関数を適用した結果をビューとして提供する

## 参照

- N4861 24 Ranges library
- C++20 ranges
- P2367R0 Remove misuses of list-initialization from Clause 24 (本提案文書はC++20に遡って適用されている)