最終更新日時(UTC):
が更新

履歴 編集

class template
<ranges>

std::ranges::to_input_view(C++26)

namespace std::ranges {
  template<input_range V>
    requires view<V>
  class to_input_view : public view_interface<to_input_view<V>> { …… }; // (1)

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

概要

  • (1): input_rangeとして振る舞うview
  • (2): to_input_viewを生成するRangeアダプタオブジェクト

このviewは、Rangeをinput_rangeに変換し、非common_rangeにする (イテレータと番兵の型を別にする)。

このviewは、パフォーマンス向上のために使用する。以下に例示する:

  • views::join(r)は、rcommon_range (イテレータと番兵の型が同じRange) である場合、イテレータと番兵の比較のために外側と内側の2種類のイテレータを順番に比較することになり比較コストが高くなる。to_inputを使用することで、番兵との比較が一回で済むためにイテレータの比較コストが小さくなり、パフォーマンス向上が見込める
  • views::chunkの場合、r | views::chunk(n)rforward_range以上である場合に各要素がviews::take(n)となり、各要素を2回ずつイテレートすることになる。input_rangeに変換することで、各要素を1回ずつイテレートすることになり、パフォーマンス向上が見込める

Rangeコンセプト

borrowed sized output input forward bidirectional random_access contiguous common viewable view
  • ※: Vに従う

効果

  • (2): 式views::to_input(E)の効果は次のいずれか(T = decltype((E))U = remove_cvref_t<T>とする)

メンバ関数

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

継承しているメンバ関数

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

推論補助

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

基本的な使い方

#include <ranges>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> v = {1, 2, 3, 4};

  for (auto i : v | std::views::to_input) {
    std::cout << i << ' ';
  }
}

出力

1 2 3 4 

viewをパフォーマンス向上させる

#include <ranges>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::vector<int>> v1 = {{1, 2}, {3, 4}};

 // `v1 | std::views::join`と比較して、イテレータと番兵の比較コストが低くなり、
 // パフォーマンスが向上する
  for (auto i : v1 | std::views::to_input | std::views::join) {
    std::cout << i << ' ';
  }

  // `v2 | std::views::chunk(3)`と比較して、各要素が1回ずつイテレートで済むため、
  // パフォーマンスが向上する
  std::vector v2 = {1, 2, 3, 4, 5, 6};
  for (const auto& v : v2 | std::views::to_input | std::views::chunk(3)) {
    for (const auto& i : v) {
      std::cout << i << ' ';
    }
    std::cout << std::endl;
  }
}

出力

1 2 3 4 1 2 3 
4 5 6 

バージョン

言語

  • C++26

処理系

参照