- ranges[meta header]
- std::ranges[meta namespace]
- class template[meta id-type]
- cpp20[meta cpp]
namespace std::ranges {
template<input_range V, copy_constructible F>
requires view<V> && is_object_v<F> &&
regular_invocable<F&, range_reference_t<V>> &&
can-reference<invoke_result_t<F&, range_reference_t<V>>>
class transform_view : public view_interface<transform_view<R>> { …… }; // (1) C++20
template<input_range V, move_constructible F>
requires view<V> && is_object_v<F> &&
regular_invocable<F&, range_reference_t<V>> &&
can-reference<invoke_result_t<F&, range_reference_t<V>>>
class transform_view : public view_interface<transform_view<R>> { …… }; // (1) C++23
namespace views {
inline constexpr /*unspecified*/ transform = /*unspecified*/; // (2)
}
}
- can-reference[link /reference/iterator/dereferenceable.md]
- (1): 指定した関数で各要素を変換した値のRangeとして振る舞う
view
- (2):
transform_view
を生成するRangeアダプタオブジェクト
borrowed |
sized |
output |
input |
forward |
bidirectional |
random_access |
contiguous |
common |
viewable |
view |
|
(1) |
(2) |
○ |
(1) |
(1) |
(1) |
|
(1) |
○ |
○ |
- (1):
V
に従う
- (2): 述語が参照を返す場合
- (2): 式
views::transform(E, P)
の効果はtransform_view(E, P)
と等しい
r
を元のRangeとする。size
はranges::size
(r)
が有効な式であるときに定義される。
#include <ranges>
#include <iostream>
int main() {
using namespace std;
int a[] = {1, 2, 3};
for (int i : a | views::transform([](int x){ return x * x; })) {
cout << i;
}
}
- views::transform[color ff0000]
#include <ranges>
#include <string>
#include <iostream>
struct Record {
int id = 0;
std::string name;
};
int main() {
using namespace std;
Record records[] = {
{1, "Alice"},
{2, "Bob"},
{3, "Charlie"}
};
for (int id : records | views::transform(&Record::id)) {
cout << id << '\n';
}
}
- views::transform[color ff0000]
- Clang: 13.0.0 [mark verified]
- GCC: 10.1.0 [mark verified]
- ICC: ?
- Visual C++: 2019 Update 10 [mark verified]