> 文章列表 > 【C++】std::transform、std::back_inserter使用

【C++】std::transform、std::back_inserter使用

【C++】std::transform、std::back_inserter使用

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;
}