Подтвердить что ты не робот

С++ lambda expression в std:: find_if?

У меня есть std:: map, который содержит класс, и этот класс имеет id. У меня есть идентификатор, который я пытаюсь найти в наборе

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

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

Я получаю сообщение об ошибке, что переменная захвата лямбда не найдена, но я понятия не имею, что я должен сделать, чтобы заставить ее захватить содержимое контейнера по мере его итерации. Кроме того, я знаю, что я не могу сделать это с помощью цикла, но я пытаюсь изучить функции лямбда.

4b9b3361

Ответ 1

У вас есть захват и аргумент. Бит внутри [] - это захват; бит внутри () - это список аргументов. Здесь вы хотите записать локальную переменную i и взять a в качестве аргумента:

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

Это эффективно сокращение для создания класса функтора с локальной переменной i:

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

Ответ 2

Из того, что я понимаю, код должен выглядеть так:

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

Это приведет к тому, что LWItem будет иметь идентификатор, равный i, причем я является ранее объявленным идентификатором.