【问题标题】:vector of future in c++11c++11中的未来向量
【发布时间】:2016-04-13 11:02:53
【问题描述】:

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

 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) 编译器。

【问题讨论】:

  • 你不能复制期货。使用引用或存储 shared_future。

标签: c++ c++11 foreach future


【解决方案1】:

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

#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() << " "; });
}

【讨论】:

  • 好东西。但是答案/结论是什么?
  • @LightnessRacesinOrbit 这里已经有一些正确的答案了。这只是为了完整性和说明。
  • 首先我要感谢所有回答的人。其次,结论是,为了在算法中使用未来,我们应该或传递一个指针或使用 shared_future 声明。
  • @GiuseppeLevi 你的意思是参考!
  • 哦,是的!我的旧式编程思想影响了我! (我的第一个编程语言是 80 年代的 F77!)... 作为参考,请参阅:cplusplus.com/articles/ENywvCM9
【解决方案2】:

你不能复制期货。

要么使用引用,要么存储shared_future

【讨论】:

  • 在我准备演示代码时被偷了 :-)
  • @RichardHodges:我没有“窃取”它(注:社区维基)我只是将它从错误的地方移到了正确的地方。如果您想将答案规则应用于您的帖子,请将其写为答案! &如果你还没有准备好发布你的答案,那么在你准备好之前不要这样做。 #FGITW
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2013-02-15
    • 2018-09-30
    • 2018-01-17
    • 2014-04-15
    • 2014-02-25
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多