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

目录

[1. 说明](#1. 说明)

[2. 用法示例](#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> 库的一部分。其主要目的是简化使用流进行输入输出操作时对带引号的字符串的处理。

相关推荐
先知后行。27 分钟前
QT实现计算器
开发语言·qt
掘根27 分钟前
【Qt】常用控件3——显示类控件
开发语言·数据库·qt
GUIQU.33 分钟前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
机器学习之心4 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
西阳未落4 小时前
C++基础(21)——内存管理
开发语言·c++·面试
我的xiaodoujiao4 小时前
Windows系统Web UI自动化测试学习系列2--环境搭建--Python-PyCharm-Selenium
开发语言·python·测试工具
max5006004 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
callJJ5 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
超级大福宝5 小时前
使用 LLVM 16.0.4 编译 MiBench 中的 patricia遇到的 rpc 库问题
c语言·c++
wangjialelele5 小时前
Linux中的线程
java·linux·jvm·c++