std::ranges::views::transform, std::ranges::transform_view

出自cppreference.com
 
 
範圍庫
範圍適配器
 
 
在標頭 <ranges> 定義
template< ranges::input_range V,
          std::copy_constructible F >
    requires ranges::view<V> &&
             std::is_object_v<F> &&
             std::regular_invocable<F&, ranges::range_reference_t<V>> &&
             /* invoke_result_t<F&, range_reference_t<V>>& 为有效类型 */
class transform_view
    : public ranges::view_interface<transform_view<V, F>>
(1) (C++20 起)
(C++23 前)
template< ranges::input_range V,
          std::move_constructible F >
    requires ranges::view<V> &&
             std::is_object_v<F> &&
             std::regular_invocable<F&, ranges::range_reference_t<V>> &&
             /* invoke_result_t<F&, range_reference_t<V>>& 为有效类型 */
class transform_view
    : public ranges::view_interface<transform_view<V, F>>
(C++23 起)
namespace views {
    inline constexpr /* 未指明 */ transform = /* 未指明 */;
}
(2) (C++20 起)
調用簽名
template< ranges::viewable_range R, class F >
    requires /* 见下文 */
constexpr ranges::view auto transform( R&& r, F&& fun );
(C++20 起)
template< class F >
constexpr /* 范围适配器闭包 */ transform( F&& fun );
(C++20 起)
1) 表示底層序列應用變換函數到每個元素後的 view 的範圍適配器。
2) 範圍適配器對象 (RangeAdaptorObject) 。對任意適合的表達式 ef,表達式 views::transform(e, f) 表達式等價transform_view(e, f)

transform_view 分別在底層視圖 V 實現 random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_rangesized_range 時實現相應概念。

數據成員

成員 說明
V base_ (私有) 底層視圖
(僅用於闡述的成員對象*)
copyable-box<F>(C++23 前)movable-box<F>(C++23 起) fun_ (私有) 底層函數對象
(僅用於闡述的成員對象*)

成員函數

構造 transform_view
(公開成員函數) [編輯]
返回底層(適配的)視圖的副本
(公開成員函數) [編輯]
返回指向起始的迭代器
(公開成員函數) [編輯]
返回 指向末尾的迭代器或哨位
(公開成員函數) [編輯]
返回元素數,僅當底層(適配的)範圍滿足 sized_range 時才提供
(公開成員函數) [編輯]
返回結果 approximately_sized_range 的估計大小
(公開成員函數) [編輯]
繼承自 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> 的公開成員函數) [編輯]

推導指引

嵌套類

迭代器類型
(僅用於闡述的成員類模板*)
哨位類型
(僅用於闡述的成員類模板*)

示例

#include <algorithm>
#include <cstdio>
#include <iterator>
#include <ranges>
#include <string>

char rot13a(const char x, const char a)
{
    return a + (x - a + 13) % 26;
}

char rot13(const char x)
{
    if ('Z' >= x and x >= 'A')
        return rot13a(x, 'A');
 
    if ('z' >= x and x >= 'a')
        return rot13a(x, 'a');
 
    return x;
}

int main()
{
    auto show = [](const unsigned char x){ std::putchar(x); };
    
    std::string in{"cppreference.com\n"};
    std::ranges::for_each(in, show);
    std::ranges::for_each(in | std::views::transform(rot13), show);
    
    std::string out;
    std::ranges::copy(std::views::transform(in, rot13), std::back_inserter(out));
    std::ranges::for_each(out, show);
    std::ranges::for_each(out | std::views::transform(rot13), show);
}

輸出:

cppreference.com
pccersrerapr.pbz
pccersrerapr.pbz
cppreference.com

參閱

應用函數到元素範圍
(算法函數對象) [編輯]