- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp20[meta cpp]
namespace std::ranges {
template<input_range V, size_t N>
requires view<V> && has-tuple-element<range_value_t<V>, N> &&
has-tuple-element<remove_reference_t<range_reference_t<V>>, N>
class elements_view : public view_interface<elements_view<V, N>> { …… }; // (1)
template<class R>
using keys_view = elements_view<views::all_t<R>, 0>; // (2)
template<class R>
using values_view = elements_view<views::all_t<R>, 1>; // (3)
namespace views {
template<size_t N>
inline constexpr /*unspecified*/ elements = /*unspecified*/; // (4)
inline constexpr auto keys = elements<0>; // (5)
inline constexpr auto values = elements<1>; // (6)
}
}
タプルと見なせる型を要素とするRangeに対して、各タプルの第N要素だけにアクセスするview
。要素へのアクセスはget
<N>
による。
- (1): 第N要素だけにアクセスする
view
- (2): 第1要素だけにアクセスする
view
- (3): 第2要素だけにアクセスする
view
- (4):
elements_view
を生成するRangeアダプタオブジェクト - (5):
keys_view
を生成するRangeアダプタオブジェクト - (6):
values_view
を生成するRangeアダプタオブジェクト
borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view |
---|---|---|---|---|---|---|---|---|---|---|
(1) | (1) | (1) | (1) | (1) | (1) | (1) | (1) | ○ | ○ |
- (1):
V
に従う
説明専用コンセプトhas-tuple-element
を次のように定義する。
// C++20
template<class T, size_t N>
concept has-tuple-element =
requires(T t) {
typename tuple_size<T>::type;
requires N < tuple_size_v<T>;
typename tuple_element_t<N, T>;
{ get<N>(t) } -> convertible_to<const tuple_element_t<N, T>&>;
};
// C++23
template<class T, size_t N>
concept has-tuple-element =
tuple-like<T> && N < tuple_size_v<T>;
- tuple_size[link /reference/tuple/tuple_size.md]
- tuple_element_t[link /reference/tuple/tuple_element.md]
- get[link /reference/tuple/tuple/get.md]
- convertible_to[link /reference/concepts/convertible_to.md]
- tuple-like[link /reference/tuple/tuple-like.md]
- tuple_size_v[link /reference/tuple/tuple_size.md]
これを用いて、
view
<V>
input_range
<V>
has-tuple-element<
range_value_t
<V>, N>
has-tuple-element<
remove_reference_t
<
range_reference_t
<V>>, N>
- (4):
E
を部分式、N
を定数式とするとき、式views::elements<N>(E)
の効果はelements_view<
views::all_t
<
decltype
((E))>, N>{E}
と等しい。
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++20 |
base |
V の参照を取得する |
C++20 |
begin |
先頭を指すイテレータを取得する | C++20 |
end |
番兵を取得する | C++20 |
size |
要素数を取得する | C++20 |
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 |
名前 | 説明 | 対応バージョン |
---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++20 |
#include <ranges>
#include <map>
#include <string>
#include <iostream>
int main() {
using namespace std;
map<int, string> m = {{1, "one"}, {2, "two"}, {3, "three"}};
for (int i : m | views::keys) {
cout << i << '\n';
}
for (const string& i : m | views::values) {
cout << i << '\n';
}
}
- views::keys[color ff0000]
- views::values[color ff0000]
1
2
3
one
two
three
- C++20
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ?
- Visual C++: 2019 Update 10 [mark verified]
zip_view
elements_viewの逆(要素からタプルを作る)