2016-04-13 17 views
5

Ciao Ho creato un vettore del futuro in C++ 11 usando una funzione lambda.vettore del futuro in 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)); 

Ha funzionato con successo, ma quando ho provato a recuperare i valori tramite una chiamata for_each ho ottenuto un errore di compilazione che non capisco.

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

I valori sono stati ottenuti con successo da un vecchio stile per ciclo:

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

Perché non ero in grado di utilizzare la funzione di for_each? Stavo usando Visual Studio 2013 cercando anche il compilatore INTEL (V16).

+3

non è possibile copiare i futures. utilizzare un riferimento o memorizzare un shared_future. –

risposta

1

Ecco il codice di prova presentati utilizzando una delle due opzioni legali:

#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

Roba buona. Ma qual è la risposta/conclusione? –

+0

@LightnessRacesinOrbit Ci sono già alcune risposte corrette qui. Questo è solo per completezza ed esposizione. –

+0

Prima di tutto vorrei ringraziare tutti coloro che hanno risposto. In secondo luogo, la conclusione è che per utilizzare un futuro all'interno di un algoritmo si dovrebbe o passare un puntatore o utilizzare la dichiarazione shared_future. –

2

Non è possibile copiare i futures.

Utilizzare un riferimento o memorizzare un shared_future.

+1

piacevolmente rubato mentre stavo preparando il codice demo :-) –

+1

@RichardHodges: Non l'ho "rubato" (N.B. wiki della comunità) L'ho semplicemente spostato dal posto sbagliato al posto giusto. Se vuoi applicare le regole di risposta al tuo post, scrivilo come risposta !! e se non sei pronto a pubblicare la tua risposta, allora semplicemente non farlo finché non lo sei. #FGITW –

1

Il costruttore di copia del futuro viene eliminato, quindi non è possibile copiarli. Utilizzo di riferimento:

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