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(双输入) |