首页 > 后端开发 > C++ > 正文

c++中std::transform函数怎么用_c++算法库transform用法详解

尼克
发布: 2025-10-09 13:57:02
原创
489人浏览过
std::transform是<algorithm>中的函数模板,用于对一个或两个序列应用操作并输出结果。它支持一元变换(如平方、转小写)和二元变换(如对应元素相加),常配合lambda、back_inserter使用,需确保目标空间足够,广泛应用于数据处理与字符串操作等场景。

c++中std::transform函数怎么用_c++算法库transform用法详解

std::transform 是 C++ 标准库 <algorithm> 中非常实用的函数模板,用于对一个或两个输入序列进行变换,并将结果写入目标区间。它支持一元操作(单个序列)和二元操作(两个序列),使用灵活,常用于数据处理、数学运算等场景。

基本语法与头文件

头文件: #include <algorithm>

std::transform 有两种主要重载形式:

1. 一元变换(对单个序列操作)

std::transform(InputIt first, InputIt last, OutputIt result, UnaryOperation op);

2. 二元变换(对两个序列操作)

立即学习C++免费学习笔记(深入)”;

std::transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt result, BinaryOperation op);

其中:

  • first, last:输入范围的起始和结束迭代器
  • result:输出容器的起始迭代器(需确保空间足够)
  • op:可调用对象(函数指针、lambda、函数对象等)

一元操作:对每个元素进行变换

常见用途包括:取绝对值、平方、转大写等。

示例:将 vector 中每个元素平方

#include <algorithm>
#include <vector>
#include <iostream>
<p>int main() {
std::vector<int> input = {1, 2, 3, 4, 5};
std::vector<int> output(input.size()); // 必须预先分配空间</p><pre class='brush:php;toolbar:false;'>std::transform(input.begin(), input.end(), output.begin(),
               [](int x) { return x * x; });

for (int val : output) {
    std::cout << val << " ";
}
// 输出:1 4 9 16 25
登录后复制

}

注意:output 容器必须已有足够空间,否则行为未定义。可用 resize 或构造时指定大小。

法语写作助手
法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31
查看详情 法语写作助手

二元操作:合并两个序列

从两个输入序列中各取一个元素,应用二元函数,结果写入目标。

示例:将两个 vector 对应元素相加

#include <algorithm>
#include <vector>
#include <iostream>
<p>int main() {
std::vector<int> a = {1, 2, 3};
std::vector<int> b = {10, 20, 30};
std::vector<int> result(a.size());</p><pre class='brush:php;toolbar:false;'>std::transform(a.begin(), a.end(), b.begin(), result.begin(),
               [](int x, int y) { return x + y; });

for (int val : result) {
    std::cout << val << " ";
}
// 输出:11 22 33
登录后复制

}

要求:第二个序列从 b.begin() 开始,至少有与第一个序列相同数量的元素,避免越界。

常用技巧与注意事项

  • Lambda 表达式最常用:简洁表达变换逻辑,如 [] (auto& x) { return tolower(x); }
  • 支持 STL 容器和原生数组:只要提供正确的迭代器即可
  • 目标容器需提前分配空间:可用 resize、reserve + back_inserter(配合 inserter)
  • 可结合 std::back_inserter 动态添加元素

示例:使用 back_inserter 避免预分配

std::vector<int> input = {1, -2, 3, -4};
std::vector<int> output;
<p>std::transform(input.begin(), input.end(), std::back_inserter(output),
[](int x) { return abs(x); });
// output 自动增长,结果为 {1, 2, 3, 4}</p>
登录后复制

注意:若使用普通指针或 begin() 迭代器,必须保证目标区域足够大。

实际应用场景

  • 字符串转小写:transform(str.begin(), str.end(), str.begin(), ::tolower)
  • 数据归一化:对数组每个元素除以最大值
  • 结构体字段提取:提取对象中的某个成员组成新序列
  • 编码转换:如 ASCII 转十六进制字符串

示例:字符串转小写

#include <cctype>
std::string s = "Hello World";
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
// s 变为 "hello world"
登录后复制

注意:::tolower 是 C 风格函数,需包含 <cctype>;在 lambda 中使用时更安全。

基本上就这些。std::transform 简洁高效,替代手写循环,提升代码可读性与安全性。掌握其两种调用方式和常见搭配,能大幅提升 STL 使用效率。

以上就是c++++中std::transform函数怎么用_c++算法库transform用法详解的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号