Skip to content

Latest commit

 

History

History
102 lines (77 loc) · 2.94 KB

File metadata and controls

102 lines (77 loc) · 2.94 KB

indices

  • ranges[meta header]
  • std::ranges::views[meta namespace]
  • cpo[meta id-type]
  • cpp26[meta cpp]
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)の効果は以下の通り:

  • Tis-integer-likeのモデルであれば、式はviews::iota(T(0), 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';
  }
}
  • std::views::indices[color ff0000]

出力

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 << ' ';
  }
}
  • std::views::indices[color ff0000]
  • std::views::filter[link filter_view.md]
  • std::views::take[link take_view.md]

出力

0 2 4 

バージョン

言語

  • C++26

処理系

  • Clang: 22.1 [mark verified]
  • GCC: 16.1 [mark verified]
  • Visual C++: 2026 Update 2 [mark noimpl]

関連項目

参照