std::transform
函数可以用于对一个序列中的每个元素进行转换,并将结果存储到另一个序列中。
们需要传递三个参数:源序列的起始迭代器、源序列的结束迭代器和目标序列的起始迭代器。
此外,我们还需要传递一个函数对象,用于对源序列中的每个元素进行转换。
以下是一个示例代码,演示了如何使用std::transform
函数对一个序列中的每个元素进行转换:
#include <iostream>
#include <vector>
#include <algorithm>
double calc_confi_interval(double rtt_interval_ratio) {
return 1.96 * rtt_interval_ratio / std::sqrt(2);
}
int main() {
std::vector<double> rtt_interval_ratios = {0.5, 0.6, 0.7, 0.8, 0.9};
std::vector<double> rtt_interval_confidences(rtt_interval_ratios.size());
int N_intervals = 3;
std::transform(rtt_interval_ratios.begin(), rtt_interval_ratios.begin() + N_intervals,
rtt_interval_confidences.begin(), calc_confi_interval);
for (int i = 0; i < rtt_interval_confidences.size(); i++) {
std::cout << rtt_interval_confidences[i] << " ";
}
std::cout << std::endl;
return 0;
}
当然 这里的函数也可以用lamda表达式来表征。
下面的例子
std::unordered_map<std::string, ComplexMat> mat_set;
std::vector<ComplexMat> res;
res.reserve(mat_set.size());
std::transform(mat_set.begin(), mat_set.end(), std::back_inserter(res),
[](const auto& pair) { return pair.second; });
这段代码使用了lambda表达式作为std::transform
函数的第四个参数,用于将mat_set
中的所有ComplexMat
对象存储到res
向量中。
lambda表达式是一种匿名函数,可以在需要时定义并使用。在这个代码中,lambda表达式的定义如下:
[](const auto& pair) { return pair.second; }
这个lambda表达式接受一个参数pair
,表示mat_set
中的一个键值对。在lambda表达式的函数体中,我们使用pair.second
获取键值对中的ComplexMat
对象,并将其作为返回值返回。
在std::transform
函数中,我们将mat_set
序列中的每个键值对都传递给lambda表达式进行处理,并将返回的ComplexMat
对象存储到res
向量中。由于res
向量的大小与mat_set
中键值对的数量相同,因此我们可以使用std::reserve
函数预分配足够的空间,以避免不必要的内存分配和复制操作。
std::back_inserter
是一个迭代器适配器,可以将元素插入到容器的末尾。在使用std::back_inserter
时,我们需要将其作为目标容器的插入迭代器使用,以便将元素插入到容器的末尾。
在这个代码中,我们使用std::back_inserter
作为std::transform
函数的第四个参数,用于将转换后的元素插入到res
向量的末尾。由于std::back_inserter
是一个插入迭代器,因此它会自动将元素插入到res
向量的末尾,而不需要我们手动调用push_back
函数。
下面给出另外一个例子,帮助更好地理解
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2;
std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
[](int x) { return x * 2; });
for (int i = 0; i < v2.size(); i++) {
std::cout << v2[i] << " ";
}
std::cout << std::endl;
return 0;
}