C++ STL泛型算法之transform

std::transform

是 C++ STL 中的一个算法,用于对 一个或两个范围(区间) 内的元素应用指定的操作,并将结果存储在输出范围中。它是泛型算法,可以用于 std::vector、std::string、std::array 等容器。

1. 一元运算

transform(Iterator inputBegin, Iterator inputEnd,Iterator OutputBegin, unary_operation); 

Iterator inputBegin(输入起始迭代器):要转换的元素起始位置
Iterator inputEnd(输入结束迭代器):要转换的元素结束位置(不包含)
Iterator OutputBegin(输出起始迭代器):转换后的结果存储的位置(可以与输入相同)
unary_operation(操作函数):对每个元素应用的转换函数(可以是 标准库函数、普通函数、Lambda 表达式 或 函数对象)

2. 二元运算

transform(Iterator inputBegin1, Iterator inputEnd1,Iterator inputBegin2, Iterator OutputBegin, binary_operation); 

Iterator inputBegin1(输入起始迭代器1):要转换的元素起始位置1
Iterator inputEnd1(输入结束迭代器1):要转换的元素结束位置(不包含)1
Iterator inputBegin2(输入起始迭代器2):要转换的元素起始位置2
Iterator OutputBegin(输出起始迭代器):转换后的结果存储的位置(可以与输入相同)
binary_operation(操作函数):对每个元素应用的转换函数(可以是 标准库函数、普通函数、Lambda 表达式 或 函数对象)

例1. 使用普通函数
#include <iostream>
#include <algorithm>
#include <string>int main() {std::string str = "Hello, World!";std::transform(str.begin(), str.end(), str.begin(), ::tolower);std::cout << str << std::endl;  // 输出: hello, world!return 0;
}
例2. 使用Lambda 表达式
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};std::vector<int> result(nums.size());  // 结果数组// 计算每个元素的平方std::transform(nums.begin(), nums.end(), result.begin(), [](int x) { return x * x; });for (int x : result) std::cout << x << " ";  // 输出: 1 4 9 16 25return 0;
}
例3. 使用普通函数
#include <iostream>
#include <vector>
#include <algorithm>// 自定义函数,将数字翻倍
int doubleNum(int x) {return x * 2;
}int main() {std::vector<int> nums = {1, 2, 3, 4, 5};std::vector<int> result(nums.size());std::transform(nums.begin(), nums.end(), result.begin(), doubleNum);for (int x : result) std::cout << x << " ";  // 输出: 2 4 6 8 10return 0;
}
例4. 使用函数对象
#include <iostream>
#include <vector>
#include <algorithm>// 自定义仿函数,计算立方
struct Cube {int operator()(int x) const {return x * x * x;}
};int main() {std::vector<int> nums = {1, 2, 3, 4, 5};std::vector<int> result(nums.size());std::transform(nums.begin(), nums.end(), result.begin(), Cube());for (int x : result) std::cout << x << " ";  // 输出: 1 8 27 64 125return 0;
}
例5. 双输入

对两个vector内的元素逐个进行操作,并存储到第三个vector中

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> a = {1, 2, 3, 4, 5};std::vector<int> b = {10, 20, 30, 40, 50};std::vector<int> result(a.size());// 逐个元素相加std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](int x, int y) { return x + y; });for (int x : result) std::cout << x << " ";  // 输出: 11 22 33 44 55return 0;
}

3. transform 和 back_inserter

back_inserter(result) 让 result 通过 push_back() 自动扩展,而不需要预分配大小。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};std::vector<int> result;std::transform(nums.begin(), nums.end(), std::back_inserter(result), [](int x) { return x * 2; });for (int x : result) std::cout << x << " ";  // 输出: 2 4 6 8 10return 0;
}

4. for_each 和 transform

选择 for_each 还是 transform,取决于是否需要修改数据

// std::for_each
std::for_each(vec.begin(), vec.end(), [](int &x) { x *= 2; });  // 修改原数据
// std::transform
std::transform(vec.begin(), vec.end(), newVec.begin(), [](int x) { return x * 2; });  // 生成新数据
任务用法
打印元素for_each
修改原数据for_each(传 &)
创建新序列transform
两个容器transform(双输入)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27969.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux : 环境变量

目录 一 环境变量 1.基本概念 二 常见环境变量 三 查看环境变量的方法 1.env:查看系统中所有环境变量 2. echo $NAME 四 如何不带路径也能运行的自己的程序 1.将自己的程序直接添加到PATH指定的路径下 五 环境变量与本地变量 1.本地变量 2. 环境变量 六C、C中main()…

【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践

YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档&#xff1a; 单机&#xff08;主备&#xff09;部署 | YashanDB Doc 另外还参考摩天轮文章&#xff1a; YashanDB 23.2.9.101 企业版安装步骤抢先看&#xff01; - 墨天轮 …

Stiring-PDF:开源免费的PDF文件处理软件

Stiring-PDF是一款开源免费且比较好用的PDF文件处理工具。 Stiring-PDF官网网址为&#xff1a;https://www.stiringpdf.com/。Stiring-PDF是一款专业的PDF文件处理工具&#xff0c;支持Windows和macOS操作系统&#xff1b;提供丰富的PDF编辑和转换功能&#xff0c;适用于日常工…

docker-compose安装anythingLLM

1、anythingLLM的docker-compose文件 version: 3.8 services:anythingllm:image: mintplexlabs/anythingllm:latestcontainer_name: anythingllmports:- "23001:3001"cap_add:- SYS_ADMINenvironment:# Adjust for your environment- STORAGE_DIR/app/server/storage…

maven推送jar包到nexus

1.背景2.推送jar包到nexus3.从nexus拉取jar包4.release和snapshot区别 1.背景 本地虚拟机centos7.9(110.110.110.100)安装好了nexus 下面演示把本地的maven项目打包推送到nexus。 2.推送jar包到nexus 我项目的命名如下: 下面演示把这个项目jar包推送到nexus仓库 <groupI…

微信小程序上如何使用图形验证码

1、php服务器生成图片验证码的代码片段如下&#xff1a; 注意红框部分的代码&#xff0c;生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码&#xff0c;不要直接image组件加上src显示&#xff0c;那样拿不到cookie&#xff0c;没有办法做图形验证码的验证&…

comfyui使用ComfyUI-AnimateDiff-Evolved, ComfyUI-Advanced-ControlNet节点报错解决

comfyui使用animate-diff生成动画&#xff0c;各种报错解决 报错1&#xff1a; ‘cond_obj’ object has no attribute ‘hooks’ 报错2&#xff1a; AdvancedControlBase.get_control_inject() takes 5 positional arguments but 6 were given 报错3&#xff1a; ‘ControlN…

centos搭建 Node.js 开发环境

Node.js &#xff0c;通常简称为Node&#xff0c;是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Chrome V8引擎&#xff0c;具备速度快、性能强等特点&#xff0c;可用于搭建各类网络应用&#xff0c;及作为小程序后端服务环境。npm 和 npx 都是和 Node.js 相关的…

涨薪技术|JMeter异步接口测试实战

前言 异步接口是指在请求发送后&#xff0c;客户端并不会立即收到响应结果。与同步接口不同&#xff0c;异步接口需要等待一段时间后才能得到相应的结果。 通常情况下&#xff0c;异步接口可以通过消息队列或事件监听器来实现。当用户请求进入系统时&#xff0c;可以将任务提…

SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总

文章目录 MDG 基于SAP S/4HANA 2023 FPS03的创新BP/C/S&#xff1a;消息控制BP/C/S&#xff1a;手工分配数据控制者MDG-F&#xff1a;使用S/4扩展数据校验功能生成式AI可用于协助自定义对象的数据变更/同时可总结批量变更的内容 MDG 基于SAP S/4HANA 2023 FPS03的创新 由于从S…

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为了…

第五天 Labview数据记录(5.2 Text文件读写)

5.2 Text文件读写 文本文件读写在程序中具有重要的作用&#xff0c;主要体现在以下几个方面&#xff1a; 1. 数据存储与持久化&#xff1b;2. 数据交换与共享&#xff1b;3. 日志记录&#xff1b;4. 配置管理&#xff1b;5. 数据备份与恢复&#xff1b;6. 用户输入与输出&…

校园快递助手小程序毕业系统设计

系统功能介绍 管理员端 1&#xff09;登录&#xff1a;输入账号密码进行登录 2&#xff09;用户管理&#xff1a;查看编辑添加删除 学生信息 3&#xff09;寄件包裹管理&#xff1a;查看所有的包裹信息&#xff0c;及物流信息 4&#xff09;待取件信息&#xff1a;查看已到达的…

Docker入门指南:Windows下docker配置镜像源加速下载

Windows下docker配置镜像源加速下载 docker的官方镜像是海外仓库&#xff0c;默认下载耗时较长&#xff0c;而且经常出现断站的现象&#xff0c;因此需要配置国内镜像源。 国内镜像源概述 国内现有如下镜像源可以使用 "http://hub-mirror.c.163.com", "http…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…

数据结构:二叉树的链式结构及相关算法详解

目录 一.链式结构的实现 1.二叉树结点基本结构&#xff0c;初始化与销毁&#xff1a; 二.链式结构二叉树的几种遍历算法 1.几种算法的简单区分&#xff1a; 2.前序遍历&#xff1a; 3.中序遍历&#xff1a; 4.后序遍历&#xff1a; 5.层序遍历&#xff08;广度优先遍历B…

动态规划/贪心算法

一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术&#xff0c;尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题&#xff0c;并保存这些子问题的解以避免重复计算&#xff0c;从而提高效率。 动态规划的核心思想 最优子结…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表&#xff0c;数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张&#xff0c;即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…

android亮灭屏流程分析

前言 亮灭涉及的东西非常多&#xff0c;因此单独写一个文档&#xff0c;进行详细说明&#xff0c;亮灭屏包括的东西不只是亮灭屏&#xff0c;还包括亮度调节、屏幕状态变化等东西。本文仅作学习使用&#xff0c;不涉及商业&#xff0c;侵权请联系删除。 framework层的学习链接…