std::ranges::views::zip, std::ranges::zip_view

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
在标头 <ranges> 定义
template<ranges::input_range... Views>

    requires (ranges::view<Views>&& ...)&&(sizeof...(Views)>0)
class zip_view

    :publicranges::view_interface<zip_view<Views...>>
(1) (C++23 起)
namespace views {

    inlineconstexpr/* 未指明 */ zip =/* 未指明 */;

}
(2) (C++23 起)
调用签名
template<ranges::viewable_range... Rs>

    requires /* 见下文 */

constexprranges::viewauto zip( Rs&&... rs);
(C++23 起)
1)zip_view 是范围适配器,接收一或多个 view 并产生一个 view,其第 i 个元素是所有视图的第 i 个元素组成的元组式值。所产生视图的大小为所有适配视图的最小大小。
2)views::zip 是定制点对象。

无实参调用时 views::zip()表达式等价auto(views::empty<std::tuple<>>)

否则,views::zip(rs...)表达式等价ranges::zip_view<views::all_t<decltype((rs))>...>(rs...)

zip_view 始终实现 input_range,并且若所有适配的 view 类型均实现 forward_rangebidirectional_rangerandom_access_rangesized_range 时实现对应的概念。

以下情况下,zip_view 实现 common_range

目录

定制点对象

名字 views::zip 代表一个定制点对象,它是某个字面semiregular 类类型的 const 函数对象。 细节参见定制点对象(CustomizationPointObject)

[编辑]数据成员

成员 说明
std::tuple<Views...>views_ 所有适配的视图对象
(仅用于阐述的成员对象*)

[编辑]成员函数

构造 zip_view
(公开成员函数)[编辑]
返回指向起始的迭代器
(公开成员函数)[编辑]
返回 指向末尾的迭代器或哨位
(公开成员函数)[编辑]
返回元素数,仅当底层(适配的)范围满足 sized_range 时才提供
(公开成员函数)[编辑]
继承自 std::ranges::view_interface
返回视图是否为空,仅当视图满足 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_rangecommon_range 时提供
(std::ranges::view_interface<D> 的公开成员函数)[编辑]
返回派生视图中的第 n 个元素,仅当视图满足 random_access_range 时提供
(std::ranges::view_interface<D> 的公开成员函数)[编辑]

[编辑]推导指引

[编辑]嵌套类

迭代器类型
(仅用于阐述的成员类模板*)
zip_view 不是 common_range 时使用的哨位类型
(仅用于阐述的成员类模板*)

[编辑]辅助模板

template<class... Views>

constexprbool enable_borrowed_range<ranges::zip_view<Views...>>=

    (ranges::enable_borrowed_range<Views>&& ...);
(C++23 起)

ranges::enable_borrowed_range 的这个特化使 zip_view 在每个底层视图都满足 borrowed_range 时也满足它。

[编辑]注解

功能特性测试标准功能特性
__cpp_lib_ranges_zip202110L(C++23)ranges::zip_view,
ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_view

[编辑]示例

#include <array>#include <iostream>#include <list>#include <ranges>#include <string>#include <tuple>#include <vector>   void print(autoconst rem, autoconst& range){for(std::cout<< rem;autoconst& elem : range)std::cout<< elem <<' ';std::cout<<'\n';}   int main(){auto x =std::vector{1, 2, 3, 4};auto y =std::list<std::string>{"α", "β", "γ", "δ", "ε"};auto z =std::array{'A', 'B', 'C', 'D', 'E', 'F'};   print("源视图:", ""); print("x: ", x); print("y: ", y); print("z: ", z);   print("\nzip(x,y,z):", "");   for(std::tuple<int&, std::string&, char&> elem : std::views::zip(x, y, z)){std::cout<<std::get<0>(elem)<<' '<<std::get<1>(elem)<<' '<<std::get<2>(elem)<<'\n';   std::get<char&>(elem)+=('a'-'A');// 修改 z 的元素}   print("\n修改后, z: ", z);}

输出:

源视图: x: 1 2 3 4 y: α β γ δ ε z: A B C D E F   zip(x,y,z): 1 α A 2 β B 3 γ C 4 δ D   修改后, z: a b c d E F

[编辑]参阅

由应用变换函数到被适配视图的对应元素的结果组成的 view
(类模板)(定制点对象)[编辑]
选取 tuple-like 值组成的 view 和数值 N,产生每个元组的第 N 个元素组成的 view
(类模板)(范围适配器对象)[编辑]
close