c++ std::transform算法怎么用 c++ STL数据转换【实例】


std::transform 是 C++ STL 中用于批量转换数据的通用算法,支持单序列一元变换(如平方、转大写)、双序列二元运算(如向量加法)、就地转换及配合 back_inserter 动态扩容,要求目标空间足够或满足不重叠写入条件。

std::transform 是 C++ STL 中用于批量转换数据的通用算法,核心作用是把一个(或两个)输入范围的元素,按指定规则处理后,写入到目标位置。它不改变原容器大小,只做“映射”操作,类似函数式编程里的 map。

单序列转换:一元操作

最常用场景:对容器每个元素做统一变换,比如全部转大写、平方、取绝对值等。

  • 需要提供起始/结束迭代器、目标起始迭代器、一个可调用对象(lambda、函数指针、函数对象)
  • 目标容器必须有足够空间(可用 back_inserter 扩容,但注意性能)

示例:把 vector 中每个数平方

vector src = {1, 2, 3, 4};
vector dst(src.size()); // 预分配空间
std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * x; });
// dst → {1, 4, 9, 16}

双序列合并转换:二元操作

用两个输入范围,对应位置元素一起参与运算,结果写入目标位置。两范围长度需一致(或至少保证不越界)。

  • 传入两个输入迭代器对,一个输出起始,一个接受两个参数的可调用对象
  • 常用于向量加法、逐元素乘积、字符串拼接等

示例:两个 vector 对应相加

vector a = {1, 2, 3};
vector b = {10, 20, 30};
vector res(a.size());
std::transform(a.begin(), a.end(), b.begin(), res.begin(), std::plus());
// res → {11, 22, 33}

目标写入到源容器自身(就地转换)

只要目标起始位置与源不重叠(或严格满足“输出不覆盖未读取输入”),就可以直接写回原容器。

  • 常见于修改原容器内容,如全部变负、转小写
  • 避免用 end() 当目标起点;用 begin() 是安全的(因 transform 顺序读取+写入)

示例:字符串每个字符转小写

string s = "ABC";
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
// s → "abc"

配合 inserter 或 back_inserter 动态扩容

当目标容器初始为空,又想自动追加结果时,可用插入迭代器。

  • back_inserter 适用于支持 push_back 的容器(vector、deque、list)
  • 注意:频繁 push_back 可能引发多次内存重分配,预估大小更高效

示例:从 set 提取偶数并放入新 vector

set nums = {1, 2, 3, 4, 5};
vector evens;
std::transform(nums.begin(), nums.end(), back_inserter(evens),
[](int x) { return x * 2; });
// evens → {2, 4, 6, 8, 10}


# c++  # String  # 字符串  # int  # Lambda  # 指针  # map  # 对象  # transform  # 算法  # 迭代  # 批量转换  # 适用于  # 它不  # 只做  # 最常用  # 就可以  # 为空  # 有足够  # font 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  php增删改查报错1054怎么办_字段名错误排查修复【解答】  Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看  如何解决Windows时间不准的问题?(自动同步设置)  使用类变量定义字符串常量时的类型安全最佳实践  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】  Win10怎样卸载TeamViewer_Win10卸载TeamViewer步骤【教程】  如何在Golang中指定模块版本_使用go.mod控制版本号  c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】  c++中如何对数组进行排序_c++数组排序算法汇总  Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】  Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】  Windows资源管理器总是卡顿或重启怎么办?(修复方法)  静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Go 中实现 Python urllib.quote() 等效功能的正确方式  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Python模块的__name__属性如何由导入方式决定?  php下载安装包太大怎么下载_分卷压缩下载方法【教程】  php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  Win11如何设置开机问候语 Win11修改登录界面提示【技巧】  c# 在ASP.NET Core中管理和取消后台任务  如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例  如何使用Golang包导出规则_控制函数和变量可见性  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  如何在 Go 中可靠地测试含 time.Time 字段的结构体  Win11怎么关闭通知消息_屏蔽Windows 11右下角弹窗通知设置【详解】  Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  Win11怎么禁用键盘自带键盘_Win11笔记本禁用内置键盘方法【教程】  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件  如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法  为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Python安全爬虫设计_IP代理池与验证码识别策略解析  Win11怎么设置开机密码_Windows11账户登录选项PIN码  如何使用正则表达式批量替换重复的“-”模式为固定字符串  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  如何使用Golang指针与结构体结合_修改结构体内部字段  Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】  Win11如何设置ipv6 Win11开启IPv6网络协议教程【步骤】  Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】  Python并发安全问题_资源竞争说明【指导】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】  如何使用Golang实现基本类型比较_Golang比较操作符使用方法 

 2025-12-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.