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

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 或构造时指定大小。
二元操作:合并两个序列
从两个输入序列中各取一个元素,应用二元函数,结果写入目标。
示例:将两个 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 使用效率。











