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

std::transform是一个C++标准库函数,用于对序列中的每个元素执行转换操作,并将结果存入另一序列。文中通过示例展示了如何使用std::transform结合lambda表达式对数据进行处理,例如计算置信区间和复制容器中的对象。lambda表达式简化了代码,提供了一种内联定义函数对象的方式。同时,文章提到了std::back_inserter的作用,即在目标容器尾部插入元素,优化内存操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值