在 C++ 中,std::transform 定义在 头文件中。它用于对范围内的元素进行转换,并将转换结果存储到目标范围中,类似于 java 或 python 中的 map。
1. 只用 transform
语法:
// 1. 单一范围版本
OutputIt transform(InputIt first, InputIt last, OutputIt d_first, UnaryOperation op);
// 2. 双范围版本
transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op);
-
first, last:输入范围 [first, last)。
-
d_first:目标范围的起始迭代器,存储转换后的结果。
-
op:一元操作函数,对输入范围的每个元素进行转换。
-
binary_op:二元操作函数,作用于两个输入范围的元素。
这里的 op 可以使用 lambda 函数快速定义,如下面的两个例子。
举例:
对一个数组每个元素取平方返回一个新的数组。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> results(nums.size());
std::transform(nums.begin(), nums.end(), results.begin(), [](int x) {
return x * x;
});
for (int n : results) {
std::cout << n << " ";
}
return 0;
}
对两个数组求和:
#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 n : result) {
std::cout << n << " ";
}
return 0;
}
2. 用 range::transform
C++ 20 引入了 range,使用 transform 的语法更简洁:
// 1. 单一范围版本
std::ranges::transform(input_range, output_iterator, unary_function);
// 2. 双范围版本
std::ranges::transform(input_range1, input_range2, output_iterator, binary_function);
-
input_range:输入范围,如 std::vector。
-
output_iterator:目标范围的起始迭代器。
-
unary_function:作用于每个元素的 一元操作([ ](int x) { return x * 2; })。
-
binary_function:作用于两个范围的 二元操作([ ](int x, int y) { return x + y; })。
对上面两个例子使用 range::transform
#include <iostream>
#include <vector>
#include <ranges>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> result(nums.size());
// 使用 std::ranges::transform
std::ranges::transform(nums, result.begin(), [](int x) {
return x * x;
});
// 输出结果
for (int n : result) {
std::cout << n << " ";
}
return 0;
}
#include <iostream>
#include <vector>
#include <ranges>
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());
// 计算两个 vector 对应位置的和
std::ranges::transform(a, b, result.begin(), [](int x, int y) {
return x + y;
});
for (int n : result) {
std::cout << n << " ";
}
return 0;
}