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

履歴 編集

customization point object
<ranges>

std::ranges::views::indices(C++26)

namespace std::ranges::views {
  inline constexpr /*unspecified*/ indices = /*unspecified*/;
}

概要

整数値nに対して、0から始まりn未満までの整数列をRangeとして生成するカスタマイゼーションポイントオブジェクト

views::indices(n)views::iota(decltype(n)(0), n)と等価であり、Rangeの要素数を指定するだけで簡潔に添字列を生成できる。for (auto i : std::views::indices(v.size()))のように、コンテナのサイズに対する添字列を作る用途に便利である。

効果

Eを整数値、Tremove_cvref_t<decltype((E))>とする。式views::indices(E)の効果は以下の通り:

備考

  • 整数型の型不一致 (views::iota(0, v.size())intsize_tの不一致でコンパイルエラーになる問題) を回避するために導入された
  • 受け付ける整数型はintegralのモデルとなる型または規格上のinteger-class型である。ただし、boolは除外される

基本的な使い方

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

int main()
{
  std::vector v = {10, 20, 30, 40, 50};

  // コンテナのサイズに対するインデックス列を生成する
  for (auto i : std::views::indices(v.size())) {
    std::cout << i << ": " << v[i] << '\n';
  }
}

出力

0: 10
1: 20
2: 30
3: 40
4: 50

Rangeアダプタと組み合わせる

views::indicesの結果はRangeなので、パイプライン記法でviews::filterなどのRangeアダプタに繋げられる。

#include <ranges>
#include <iostream>

int main()
{
  // 0以上10未満のインデックス列のうち、偶数の先頭3つを取り出す
  for (auto i : std::views::indices(10)
              | std::views::filter([](auto x) { return x % 2 == 0; })
              | std::views::take(3)) {
    std::cout << i << ' ';
  }
}

出力

0 2 4 

バージョン

言語

  • C++26

処理系

関連項目

参照