在 C++ 中使用 reduce() 和 std::execution 时出现编译错误

Posted

技术标签:

【中文标题】在 C++ 中使用 reduce() 和 std::execution 时出现编译错误【英文标题】:Compilation error while using reduce() and std::execution in C++ 【发布时间】:2020-05-02 18:00:31 【问题描述】:

我正在尝试实现一个简单的用例reduce()std:: execution。我对以下代码使用 C++ 17 标准。但是,下面的代码仍然没有被编译。

#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>
#include <execution>

int main() 
    std:: vector<int> vec(10);
    std:: iota(std::begin(vec), std::end(vec), 1);
    const auto result = std::reduce(std::execution::par, std::begin(vec),
            std::end(vec));
    std:: cout << result;
    return 0;

错误:

C:\Users\Blind1729\Desktop>g++ --std=c++17 a.cpp
a.cpp: In function 'int main()':
a.cpp:8:25: error: 'reduce' is not a member of 'std'
    const auto result = std::reduce(std::execution::par, std::begin(vec),
                        ^
a.cpp:8:42: error: 'std::execution' has not been declared
    const auto result = std::reduce(std::execution::par, std::begin(vec),

【问题讨论】:

std::reduce&lt;numeric&gt; 你用的是什么版本的g++? 并行标准化 TS P0024R2 9.x 你必须至少有 9.x 的 G++。见reference GCC 5.1 于 2015 年发布,对于 C++17 来说有点旧 @IgorR。当您将鼠标悬停在功能 C++ Standardization of Parallelism TS 中的 9.x(作为 G++)上时,将显示 需要与 -ltbb 链接 在这里编译并运行良好,使用 gcc 9.2.1 和 g++ --std=c++17 reduce.cc -ltbb 【参考方案1】:

您需要链接到 TBB,因为它依赖于并行 STD(请参阅 C++17 STL Parallel Algorithms - with GCC 9.1 and Intel TBB on Linux and macOS):

g++ --std=c++17 a.cpp -ltbb

并确保您至少安装了 GCC 9.1。

【讨论】:

以上是关于在 C++ 中使用 reduce() 和 std::execution 时出现编译错误的主要内容,如果未能解决你的问题,请参考以下文章

找不到标头`execution`和`std::reduce`

如何使用 g++6 编译带有 std::reduce 和 #include <execution_policy> 的代码?

在 C++ 中使用 <execution> 的标头的问题

mapreduce C++ lambda:候选不可行的单个参数

c++ 如何将 std::mutex 和 std::lock_guard 与仿函数一起使用?

使用 std::chrono 在 C++ 中输出日期和时间