std::ranges:: views:: zip_transform, std::ranges:: zip_transform_view
|
定义于头文件
<ranges>
|
||
|
template
<
std::
move_constructible
F,
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (C++23 起) |
|
namespace
views
{
inline
constexpr
/*unspecified*/
zip_transform
=
/*unspecified*/
;
|
(2) | (C++23 起) |
|
调用签名
|
||
|
template
<
class
F,
ranges::
viewable_range
...
Rs
>
requires
/* see below */
|
(C++23 起) | |
zip_transform_view
是一个范围适配器,它接受一个可调用对象和一个或多个
view
,并生成一个
view
,其第
i
个元素是将可调用对象应用于所有视图的第
i
个元素的结果。
当且仅当
T&
是有效类型时,类型
T
才满足仅用于阐述的概念
/*can-reference*/
。
views::zip_transform
是一个定制点对象。
当使用单一参数
f
调用时,令
FD
为
std::
decay_t
<
decltype
(
f
)
>
,若满足:
-
FD满足copy_constructible概念, -
FD
&
满足
regular_invocable概念,且 - std:: invoke_result_t < FD & > 为对象类型,
则
views
::
zip_transform
(
f
)
表达式等价
于
(
(
void
)
f,
auto
(
views::
empty
<
std::
decay_t
<
std::
invoke_result_t
<
FD
&
>>>
)
)
。否则对
views::zip_transform
的调用非良构。
zip_transform_view
在底层的
ranges::
zip_view
<
Views...
>
满足相应概念时,其自身也建模以下概念:
random_access_range
、
bidirectional_range
、
forward_range
、
input_range
、
common_range
以及
sized_range
。
目录 |
定制点对象
名称
views::zip_transform
表示一个
定制点对象
,这是一个常量
函数对象
,属于字面量
semiregular
类类型。详见
CustomizationPointObject
说明。
成员函数
构造一个
zip_transform_view
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
返回元素数量,仅当每个底层(适配的)范围满足
sized_range
时提供
(公开成员函数) |
|
继承自 std::ranges::view_interface |
|
返回派生视图是否为空,仅当满足
sized_range
或
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
|
(C++23)
|
返回指向范围起始位置的常量迭代器
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
(C++23)
|
返回范围常量迭代器的哨兵
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图是否非空,仅当
ranges::empty
可应用于它时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的首个元素,仅当满足
forward_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的最后一个元素,仅当满足
bidirectional_range
和
common_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的第
n
个元素,仅当满足
random_access_range
时提供
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
推导指引
成员类型
| 成员类型 | 定义 |
InnerView
(私有)
|
ranges::
zip_view
<
Views...
>
.
( 仅用于说明的成员类型* ) |
ziperator
(私有)
|
|
zentinel
(私有)
|
|
数据成员
| 成员对象 | 定义 |
zip_
(private)
|
类型为
InnerView
的底层视图对象
( 仅用于说明的成员对象* ) |
fun_
(private)
|
类型为
movable-box
<F>
的可调用包装对象
( 仅用于说明的成员对象* ) |
嵌套类
|
迭代器类型
( 仅用于说明的成员类模板* ) |
|
当底层
zip_view
不是
common_range
时使用的哨兵类型
( 仅用于说明的成员类模板* ) |
注释
| 功能测试 宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__cpp_lib_ranges_zip
|
202110L
|
(C++23) |
ranges::
zip_view
,
std::ranges::zip_transform_view
,
ranges:: adjacent_view , ranges:: adjacent_transform_view |
示例
#include <array> #include <iostream> #include <list> #include <ranges> #include <vector> void print(auto const rem, auto const& r) { std::cout << rem << '{'; for (char o[]{0,' ',0}; auto const& e : r) std::cout << o << e, *o = ','; std::cout << "}\n"; } int main() { auto v1 = std::vector<float>{1, 2, 3}; auto v2 = std::list<short>{1, 2, 3, 4}; auto v3 = std::to_array({1, 2, 3, 4, 5}); auto add = [](auto a, auto b, auto c) { return a + b + c; }; auto sum = std::views::zip_transform(add, v1, v2, v3); print("v1: ", v1); print("v2: ", v2); print("v3: ", v3); print("sum: ", sum); }
输出:
v1: {1, 2, 3}
v2: {1, 2, 3, 4}
v3: {1, 2, 3, 4, 5}
sum: {3, 6, 9}
参见
|
(C++23)
|
由被适配视图的对应元素引用组成的元组构成的
view
(类模板) (定制点对象) |
对序列中的每个元素应用转换函数的
view
(类模板) (范围适配器对象) |
|
接收由
tuple-like
值构成的
view
和一个数字 N,生成每个元组第 N 个元素的
view
(类模板) (范围适配器对象) |