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を整数値、Tをremove_cvref_t<decltype((E))>とする。式views::indices(E)の効果は以下の通り:
Tがis-integer-likeのモデルであれば、式はviews::iota(T(0), E)と等価- そうでなければ、呼び出しは不適格
備考
- 整数型の型不一致 (
views::iota(0, v.size())がintとsize_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
処理系
- Clang: 22.1 ✅
- GCC: 16.1 ✅
- Visual C++: 2026 Update 2 ❌