如何在 C++ 中使用 for_each 累积结果? [复制]

Posted

技术标签:

【中文标题】如何在 C++ 中使用 for_each 累积结果? [复制]【英文标题】:How to accumulate a result using for_each in C++? [duplicate] 【发布时间】:2021-01-05 13:56:08 【问题描述】:

我正在尝试使用 for_each 重现 accumulate 所做的事情。但是我不明白for_each 版本有什么问题:

int main() 
    std::function<float(float, int)> func = [](float a, int i) return a * i; ;
    std::vector<int> m 1, 2, 3, 4 ; // <-- Multiply: 1*2*3*4 = 24


    float accumulationUsingAccumulate = 1.0f;
    accumulationUsingAccumulate = accumulate(m.cbegin(), m.cend(), accumulationUsingAccumulate, func);
    std::cout << "[Accumulate] Result = " << accumulationUsingAccumulate << std::endl;
    

    float accumulationUsingForEach = 1.0f;
    std::for_each(m.cbegin(), m.cend(), [&accumulationUsingForEach, &m, &func]() 
        accumulationUsingForEach = func(accumulationUsingForEach, *m.cbegin()++);
    );
    std::cout << "[For Each] Result = " << accumulationUsingForEach << std::endl;

第二个版本的外层 lambda 函数需要参数吗?

返回以下错误信息:

【问题讨论】:

std::for_each 想要接受一个参数的函数(包括 lambda 函数)。为什么不给呢? 只需要一个参数int i,并使用它来代替*m.cbegin()++。另外,请在代码无法编译时添加错误消息。 (您已经得到了答案)您知道您也应该将错误消息作为可复制文本发布,对吧? 【参考方案1】:

std::for_each第三个参数,一元函数,应该接受当前元素

float accumulationUsingForEach = 1.0f;
std::for_each(m.cbegin(), m.cend(), [&accumulationUsingForEach, &func](const float& a) 
    accumulationUsingForEach = func(accumulationUsingForEach, a);
);
std::cout << "[For Each] Result = " << accumulationUsingForEach << std::endl;

【讨论】:

以上是关于如何在 C++ 中使用 for_each 累积结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 等效于 GCC 实验性并行 for_each?

C++ STL for_each 的用法?

c++ for_each

如何从 pool.apply_async 调用中累积结果?

如何计算 C++ 中双精度向量的累积和?

如何在 terraform 中正确使用 for_each 中的 each.value?