c 11 中的未来向量

新手上路,请多包涵

嗨,我使用 lambda 函数在 C++11 中创建了一个未来向量。

  vector<double> v = { 0, 1.1, 2.2, 3.3, 4.4, 5.5 };
auto K = [=](double z){
    double y=0;
for (const auto x : v)
    y += x*x*z;
return y;
};
vector<future<double>> VF;
for (double i : {1,2,3,4,5,6,7,8,9})
VF.push_back(async(K,i));

它成功运行,但是当我尝试通过 for_each 调用检索值时,我得到了一个我不理解的编译错误。

  for_each(VF.begin(), VF.end(), [](future<double> x){cout << x.get() << " "; });

这些值是通过旧式 for 循环成功获得的:

  for (int i = 0; i < VF.size(); i++)
    cout << VF[i].get() << " ";

为什么我无法使用 for_each 功能?我正在使用 Visual Studio 2013 也尝试使用 INTEL ( V16) 编译器。

原文由 Giuseppe Levi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 547
2 个回答

以下是使用两种合法选项中的任何一种呈现的测试代码:

 #include <vector>
#include <future>
#include <iostream>
#include <algorithm>

using namespace std;

// option 1 : pass a reference to the future
void test1()
{
    vector<double> v = { 0, 1.1, 2.2, 3.3, 4.4, 5.5 };
    auto K = [=](double z){
    double y=0;
    for (const auto x : v)
        y += x*x*z;
    return y;
    };

    vector<future<double>> VF;
    for (double i : {1,2,3,4,5,6,7,8,9})
    VF.push_back(async(K,i));

    for_each(VF.begin(), VF.end(), [](future<double>& x){cout << x.get() << " "; });
}

// option 2 : store shared_futures which allow passing copies
void test2()
{
    vector<double> v = { 0, 1.1, 2.2, 3.3, 4.4, 5.5 };
    auto K = [=](double z){
    double y=0;
    for (const auto x : v)
        y += x*x*z;
    return y;
    };

    vector<shared_future<double>> VF;
    for (double i : {1,2,3,4,5,6,7,8,9})
    VF.push_back(async(K,i));

    for_each(VF.begin(), VF.end(), [](shared_future<double> x){cout << x.get() << " "; });
}

原文由 Richard Hodges 发布,翻译遵循 CC BY-SA 3.0 许可协议

未来的复制构造函数被删除,所以你不能复制它们。使用参考:

 for_each(VF.begin(), VF.end(), [](future<double>& x){cout << x.get() << " "; });
                                                ^~~~~ !

原文由 marcinj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题