2016-04-13 13 views
5

Witam Stworzyłem wektor przyszłości w C++ 11, używając funkcji lambda.wektor przyszłości w 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)); 

Udało się pomyślnie, ale kiedy próbowałem pobrać wartości poprzez wywołanie for_each Zdobyłem błąd kompilacji, że ja nie rozumiem.

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

Wartości zostały pomyślnie uzyskane przez starego stylu pętli for:

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

Dlaczego nie był w stanie skorzystać z funkcji for_each? Używałem Visual Studio 2013 próbując również kompilator INTEL (V16).

+3

nie można kopiować przyszłości. użyj referencji lub przechowuj udostępnioną_teksturę. –

Odpowiedz

1

Oto kod testu przedstawiane za pomocą jednej z dwóch opcji prawnych:

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

Dobre rzeczy. Ale jaka jest odpowiedź/zakończenie? –

+0

@LightnessRacesinOrbit Istnieje już kilka poprawnych odpowiedzi tutaj. Jest to jedynie dla kompletności i ekspozycji. –

+0

Przede wszystkim chciałbym podziękować wszystkim, którzy udzielili odpowiedzi. Po drugie, wniosek jest taki, że aby wykorzystać przyszłość w algorytmie, należy lub przekazać wskaźnik lub użyć deklaracji shared_future. –

2

Nie można kopiować kontraktów terminowych.

Użyj odwołania lub przechowuj numer shared_future.

+1

ładnie skradziony podczas przygotowywania kodu demo :-) –

+1

@RichardHodges: Nie "ukradłem" go (N.B. community wiki) Po prostu przeniosłem go z niewłaściwego miejsca w odpowiednie miejsce. Jeśli chcesz, aby reguły odpowiedzi były stosowane do Twojego posta, zapisz je jako odpowiedź !! Jeśli nie jesteś jeszcze gotowy, aby opublikować swoją odpowiedź, po prostu nie rób tego, dopóki nie jesteś. #FGITW –

1

Kopiuj konstruktor przyszłości został usunięty, więc nie można ich skopiować. Zastosowanie referencyjny:

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