С++ 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; }
Я получаю сообщение об ошибке, что переменная захвата лямбда не найдена, но я понятия не имею, что я должен сделать, чтобы заставить ее захватить содержимое контейнера по мере его итерации.
Кроме того, я знаю, что я не могу сделать это с помощью цикла, но я пытаюсь изучить функции лямбда.
Ответы
Ответ 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, причем я является ранее объявленным идентификатором.