2016-04-13 43 views
5

Xin chào, tôi đã tạo ra một vectơ tương lai trong C++ 11 sử dụng hàm lambda.vectơ tương lai trong 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)); 

Nó hoạt động thành công nhưng khi tôi cố truy xuất giá trị qua cuộc gọi for_each, tôi đã nhận được lỗi biên dịch mà tôi không hiểu.

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

Các giá trị đã thu được thành công bởi một phong cách cũ cho vòng lặp:

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

Tại sao tôi đã không thể sử dụng chức năng for_each? Tôi đã sử dụng Visual Studio 2013 cố gắng cũng là trình biên dịch INTEL (V16).

+3

bạn không thể sao chép tương lai. sử dụng tham chiếu hoặc lưu trữ shared_future. –

Trả lời

1

Đây là mã kiểm tra được trình bày bằng một trong hai tùy chọn quy phạm pháp luật:

#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

Nội dung hay. Nhưng câu trả lời/kết luận là gì? –

+0

@LightnessRacesinOrbit Đã có một số câu trả lời đúng ở đây. Đây chỉ là để hoàn thành và trình bày. –

+0

Trước hết tôi muốn cảm ơn tất cả mọi người đã trả lời. Thứ hai kết luận là để sử dụng một tương lai bên trong một thuật toán người ta nên hoặc vượt qua một con trỏ hoặc sử dụng khai báo shared_future. –

2

Bạn không thể sao chép tương lai.

Hoặc sử dụng tham chiếu hoặc lưu trữ shared_future.

+1

bị đánh cắp độc đáo trong khi tôi đang chuẩn bị mã demo :-) –

+1

@RichardHodges: Tôi không "ăn cắp" nó (cộng đồng wiki) Tôi chỉ đơn giản là di chuyển nó từ nơi sai đến đúng nơi. Nếu bạn muốn các quy tắc trả lời áp dụng cho bài đăng của mình, hãy viết nó như một câu trả lời !! và nếu bạn chưa sẵn sàng để đăng câu trả lời của bạn thì chỉ đơn giản là không cho đến khi bạn đang có. #FGITW –

1

Trình tạo bản sao của tương lai sẽ bị xóa, do đó bạn không thể sao chép chúng. Sử dụng tài liệu tham khảo:

for_each(VF.begin(), VF.end(), [](future<double>& x){cout << x.get() << " "; }); 
               ^~~~~ ! 
Các vấn đề liên quan