2013-05-03 49 views
17

Tôi đã có một bản đồ :: có chứa một lớp và lớp đó có một id. Tôi có một id mà tôi đang cố gắng tìm thấy trong tập hợpC++ biểu thức lambda trong std :: find_if?

typedef std::set<LWItem> ItemSet; 
ItemSet selectedItems; 
LWItemID i = someID; 

ItemSet::iterator isi; 
isi = std::find_if(selectedItems.begin(), selectedItems.end(), [&a](LWItemID i)->bool { return a->GetID()==i; } 

Tôi nhận được lỗi nói rằng biến chụp lambda không được tìm thấy, nhưng tôi không biết tôi phải làm gì để có được nó để nắm bắt nội dung của vùng chứa khi nó lặp qua. Ngoài ra, tôi biết rằng tôi không thể làm điều này với một vòng lặp, nhưng tôi đang cố gắng để tìm hiểu chức năng lambda.

+2

Nơi mà bạn đã tuyên bố 'một '? Bạn đang tìm kiếm gì? 'map' hoặc' set'? –

+0

'selectedItems' là một container' LWItem 's, do đó lambda không thể lấy' LWItemID' làm đối số. Nó phải lấy một câu lệnh 'LWItem' (có thể là' const & ') –

+0

nếu nó có vẻ như là một câu hỏi ngu ngốc. Vấn đề chính của tôi dường như là tôi không chắc chắn làm thế nào để nắm bắt biến 'LWItem' cục bộ,' i' và phần tử được lặp lại thông qua 'std :: find_if'. –

Trả lời

20

Bạn đã bị bắt và đối số bị đảo ngược. Bit bên trong [] là ảnh chụp; bit bên trong () là danh sách đối số. Ở đây bạn muốn chụp các địa phương biến i và chịu a như một cuộc tranh cãi:

[i](LWItem a)->bool { return a->GetID()==i; } 

Đây là một cách hiệu quả một cách viết tắt để tạo một lớp functor với biến địa phương i:

struct { 
    LWItemID i; 
    auto operator()(LWItem a) -> bool { return a->GetID()==i; } 
} lambda = {i}; 
+4

Cảm ơn sự giúp đỡ. Điều này sẽ dạy tôi thử và viết mã khi tôi siêu mệt mỏi (mặc dù tôi dường như không bao giờ học). –

10

Từ những gì tôi hiểu bạn mã nên trông như thế này:

auto foundItem = std::find_if(selectedItems.begin(), selectedItems.end(), 
[&i](LWItem const& item) 
{ 
return item->GetID() == i; 
}); 

này sẽ nắm bắt được LWItem rằng có một ID bằng i, với i là một ID previosuly tuyên bố.

+0

Cảm ơn rất nhiều vì đã giúp đỡ :) –