Namespaces
Variants

std::ranges:: views:: adjacent_transform, std::ranges:: adjacent_transform_view, std::ranges:: views:: pairwise_transform

From cppreference.net
Ranges library
Range adaptors
adjacent_transform_view views::adjacent_transform
(C++23) (C++23)
views::pairwise_transform
(C++23)

定义于头文件 <ranges>
template < ranges:: forward_range V, std:: move_constructible F, std:: size_t N >

requires ranges:: view < V > && ( N > 0 ) && std:: is_object_v < F > &&
std:: regular_invocable < F & ,
/*REPEAT*/ ( ranges:: range_reference_t < V > , N ) ... > &&
/*can-reference*/ < std:: invoke_result_t < F & ,
/*REPEAT*/ ( ranges:: range_reference_t < V > , N ) ... >>
class adjacent_transform_view

: public ranges:: view_interface < adjacent_transform_view < V, F, N >>
(1) (C++23 起)
namespace views {

template < std:: size_t N >
constexpr /* 未指定 */ adjacent_transform = /* 未指定 */ ;

}
(2) (C++23 起)
namespace views {

inline constexpr auto pairwise_transform = adjacent_transform < 2 > ;

}
(3) (C++23 起)
调用签名
template < ranges:: viewable_range R, class F >

requires /* 见下文 */

constexpr ranges:: view auto adjacent_transform < N > ( R && r, F && fun ) ;
(C++23 起)
template < class F >
constexpr /*range adaptor closure*/ adjacent_transform < N > ( F && fun ) ;
(C++23 起)
1) adjacent_transform_view 是一个范围适配器,它接收一个 view 和一个可调用对象 fun ,并生成一个 view ,其第 i 个元素是通过将 fun 应用于原始视图的 [ i , i + N ) 区间内每个元素所得到的结果值。 F 始终具有 元数 N
S 为原始视图的尺寸。则生成视图的尺寸为:
  • S - N + 1 ,当 S >= N 时,
  • 0 否则,此时生成的视图为空。
2) 名称 views :: adjacent_transform < N > 表示一个 范围适配器对象 。给定子表达式 e f ,以及常量表达式 N ,表达式 views :: adjacent_transform < N > ( e, f ) 表达式等价 于:
3) 名称 views :: pairwise_transform 表示一个行为与 views :: adjacent_transform < 2 > 完全相同的 范围适配器对象 。特别地, F 的元数同样为 2 ,且 fun 是一个二元可调用对象。

adjacent_transform_view 始终满足 forward_range 概念,若被适配的 view 类型满足相应概念,则同时满足 bidirectional_range random_access_range sized_range 概念。

目录

成员函数

构造 adjacent_transform_view
(公开成员函数)
返回指向起始位置的迭代器
(公开成员函数)
返回指向末尾位置的迭代器或哨兵
(公开成员函数)
返回元素数量,仅当底层(适配的)范围满足 sized_range 时提供
(公开成员函数)
返回结果 approximately_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 (private) ranges:: adjacent_view < V, N >
( exposition-only member type* )
inner_iterator (private)
inner_sentinel (private)

数据成员

成员 描述
/*movable-box*/ < F > fun_ (私有) 可转换调用对象
( 仅用于说明的成员对象* )
ranges:: adjacent_view < V,N > inner_ (私有) 存储的视图
( 仅用于说明的成员对象* )

嵌套类

迭代器类型
( 仅用于说明的成员类模板* )
adjacent_transform_view 不是 common_range 时使用的哨兵类型
( 仅用于说明的成员类模板* )

注释

views :: adjacent_transform 仅接受前向范围,即使当 N 0 时也是如此。

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

示例

#include <array>
#include <iostream>
#include <ranges>
int main()
{
    constexpr static std::array data{1, 2, 3, 4, 5, 6};
    constexpr int window{3};
    auto Fun = [](auto... ints) { return (... + ints); };
    // 或者,Fun 可以是任何三元(当 window == 3 时)可调用对象,例如:
    // auto Fun = [](int x, int y, int z) { return x + y + z; };
    constexpr auto view = data | std::views::adjacent_transform<window>(Fun);
    static_assert(
        view.size() == (data.size() - window + 1)
        && std::array{6, 9, 12, 15}
        == std::array{view[0], view[1], view[2], view[3]}
        && view[0] == Fun(data[0], data[1], data[2])
        && view[1] == Fun(data[1], data[2], data[3])
        && view[2] == Fun(data[2], data[3], data[4])
        && view[3] == Fun(data[3], data[4], data[5])
    );
    for (int x : view)
        std::cout << x << ' ';
    std::cout << '\n';
}

输出:

6 9 12 15

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 4098 C++23 views :: adjacent_transform < 0 > 过去接受仅输入范围 改为拒绝

参考文献

  • C++23 标准 (ISO/IEC 14882:2024):
  • 26.7.27 相邻变换视图 [range.adjacent.transform]

参见

由被适配视图相邻元素的引用元组组成的 view
(类模板) (范围适配器对象)
对序列中的每个元素应用转换函数的 view
(类模板) (范围适配器对象)
由被适配视图对应元素应用转换函数的结果组成的 view
(类模板) (定制点对象)
对元素范围应用函数
(算法函数对象)