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

相关推荐
1024奇点7 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch7 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
FlightYe8 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
Knight_AL8 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
ZhengEnCi8 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
FRing039 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
罗西的思考9 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
by209999 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河9 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮9 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php