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

std::transform 是 C++ 标准库
基本语法与头文件
头文件: #includestd::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#include #include int main() { std::vector
input = {1, 2, 3, 4, 5}; std::vector output(input.size()); // 必须预先分配空间 std::transform(input.begin(), input.end(), output.begin(), [](int x) { return x * x; }); for (int val : output) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn val zuojiankuohaophpcnzuojiankuohaophpcn " "; } // 输出:1 4 9 16 25}
注意:
output容器必须已有足够空间,否则行为未定义。可用 resize 或构造时指定大小。二元操作:合并两个序列
从两个输入序列中各取一个元素,应用二元函数,结果写入目标。
示例:将两个 vector 对应元素相加
#include#include #include int main() { std::vector
a = {1, 2, 3}; std::vector b = {10, 20, 30}; std::vector result(a.size()); std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](int x, int y) { return x + y; }); for (int val : result) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn val zuojiankuohaophpcnzuojiankuohaophpcn " "; } // 输出:11 22 33}
要求:第二个序列从 b.begin() 开始,至少有与第一个序列相同数量的元素,避免越界。
常用技巧与注意事项
- Lambda 表达式最常用:简洁表达变换逻辑,如 [] (auto& x) { return tolower(x); }
- 支持 STL 容器和原生数组:只要提供正确的迭代器即可
- 目标容器需提前分配空间:可用 resize、reserve + back_inserter(配合 inserter)
- 可结合 std::back_inserter 动态添加元素
示例:使用 back_inserter 避免预分配
std::vectorinput = {1, -2, 3, -4}; std::vector output; std::transform(input.begin(), input.end(), std::back_inserter(output), [](int x) { return abs(x); }); // output 自动增长,结果为 {1, 2, 3, 4}
注意:若使用普通指针或 begin() 迭代器,必须保证目标区域足够大。
实际应用场景
- 字符串转小写:transform(str.begin(), str.end(), str.begin(), ::tolower)
- 数据归一化:对数组每个元素除以最大值
- 结构体字段提取:提取对象中的某个成员组成新序列
- 编码转换:如 ASCII 转十六进制字符串
示例:字符串转小写
#includestd::string s = "Hello World"; std::transform(s.begin(), s.end(), s.begin(), ::tolower); // s 变为 "hello world" 注意:::tolower 是 C 风格函数,需包含
基本上就这些。std::transform 简洁高效,替代手写循环,提升代码可读性与安全性。掌握其两种调用方式和常见搭配,能大幅提升 STL 使用效率。











