C++11 中的未来向量

vector of future in c++11

本文关键字:向量 未来 C++11      更新时间:2023-10-16

嗨,我在 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(编译器。

以下是使用两个合法选项之一提供的测试代码:

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

你不能复制期货。

要么

使用引用,要么存储shared_future

将删除未来的复制构造函数,因此无法复制它们。使用参考:

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