C++ 标准模板库算法之 transform 用法

发布于:2025-07-04 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

1. 说明

2. 用法示例


1. 说明

std::transform 是一种多功能算法,用于将已知函数应用于一个或多个范围内的元素并将结果存储在输出范围内。它主要有两种形式:一元运算和二元运算。具体来说是在 <algorithm> 标头中。函数声明:

template< class InputIt, class OutputIt, class UnaryOp >

OutputIt transform( InputIt first1, InputIt last1,

                    OutputIt d_first, UnaryOp unary_op );

(1)

(constexpr since C++20)

template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2, class UnaryOp >
ForwardIt2 transform( ExecutionPolicy&& policy,
                      ForwardIt1 first1, ForwardIt1 last1,

                      ForwardIt2 d_first, UnaryOp unary_op );

(2)

(since C++17)

template< class InputIt1, class InputIt2,

          class OutputIt, class BinaryOp >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2,

                    OutputIt d_first, BinaryOp binary_op );

(3)

(constexpr since C++20)

template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2,
          
class ForwardIt3, class BinaryOp >
ForwardIt3 transform( ExecutionPolicy&& policy,
                      ForwardIt1 first1, ForwardIt1 last1,
                      ForwardIt2 first2,

                      ForwardIt3 d_first, BinaryOp binary_op );

(4)

(since C++17)

一元操作的函数相当于:Ret fun(const Type &a);

二元操作的函数相当于:Ret fun(const Type1 &a, const Type2 &b);

即传进去的是一个函数对象。

2. 用法示例

#include <algorithm>

#include <cctype>

#include <iomanip>

#include <iostream>

#include <string>

#include <utility>

#include <vector>

 

void print_ordinals(const std::vector<unsigned>& ordinals)

{

    std::cout << "ordinals: ";

    for (unsigned ord : ordinals)

        std::cout << std::setw(3) << ord << ' ';

    std::cout << '\n';

}

 

char to_uppercase(unsigned char c)

{

    return std::toupper(c);

}

 

void to_uppercase_inplace(char& c)

{

    c = to_uppercase(c);

}

 

void unary_transform_example(std::string& hello, std::string world)

{

    // string就地转化为大写形式

 

    std::transform(hello.cbegin(), hello.cend(), hello.begin(), to_uppercase);

    std::cout << "hello = " << std::quoted(hello) << '\n';

 

    // for_each version (see Notes above)

    std::for_each(world.begin(), world.end(), to_uppercase_inplace);

    std::cout << "world = " << std::quoted(world) << '\n';

}

 

void binary_transform_example(std::vector<unsigned> ordinals)

{

    // 将数转换为double

 

    print_ordinals(ordinals);

 

    std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(),

                   ordinals.begin(), std::plus<>{});

 //或使用 std::plus<>()

    print_ordinals(ordinals);

}

 

int main()

{

    std::string hello("hello");

    unary_transform_example(hello, "world");

 

    std::vector<unsigned> ordinals;

    std::copy(hello.cbegin(), hello.cend(), std::back_inserter(ordinals));

    binary_transform_example(std::move(ordinals));

}

输出:

hello = "HELLO"

world = "WORLD"

ordinals:  72  69  76  76  79

ordinals: 144 138 152 152 158

说明:std::quoted 是 C++14 中引入的 I/O 操作符,属于 <iomanip> 库的一部分。其主要目的是简化使用流进行输入输出操作时对带引号的字符串的处理。