gpt4 book ai didi

c++ - 将 std::transform 与 std::normal_distribution 和 std::bind 结合使用

转载 作者:行者123 更新时间:2023-11-30 03:36:21 25 4
gpt4 key购买 nike

STL c++11 解决方案:

auto distribution = std::bind(std::normal_distribution<double>{mean, stddev},
std::mt19937(std::random_device{}())
);
std::transform(data.begin(), data.end(), data.begin(),
std::bind(std::plus<double>(), std::placeholders::_1, distribution()));

简单的基于范围的循环:

for (auto& d : data) {
d += distribution();
}

我的 STL 解决方案不起作用,因为它总是采用从分发中生成的第一个数字。我尝试将占位符作为第三个参数,但它没有任何改变。我所有的数据都增加了相同的数字,这不是我想要的。我想要与基于范围的循环相同的行为。

这可能吗?

最佳答案

让我们将您的第二个 bind 重写为 lambda,以了解它的实际工作原理:

auto func = std::bind(std::plus<double>(), std::placeholders::_1, distribution())

也是等价的

auto d = distribution();

auto func = [d](double x){ return std::plus<double>()(x,d); };

或者,如果我们使用 C++14 的初始化功能:

auto func = [d=distribution()](double x){ return std::plus<double>()(x,d); };

如您所见,distribution() 仅被调用一次。但是,您不想使用 distribution 的返回值,您希望在每次调用 func 时调用 distribution。虽然可以使用 bind 来做到这一点,但 lambda 会让这件事变得容易得多:

std::transform(data.begin(), data.end(), data.begin(),
[&distribution](double x){ return x + distribution(); });

在我看来,这比您之前的 bind 更容易阅读。请注意,std::bind(或者说 boost::bind)早于 lambda。有some issues with lambdas在 C++11 中,与 std::bind 相比,但在 C++14 中,lambda 通常更容易处理、阅读和理解,而不会牺牲太多。

关于c++ - 将 std::transform 与 std::normal_distribution 和 std::bind 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com