У меня небольшая проблема с лямбда-выражением при использовании remove_if
на std::vector
У меня есть следующий кусок кода:
std::remove_if( openList.begin(), openList.end(),
[&](BoardNode& i){
std::cout<< i.getCoordinates() << std::endl;
std::cout<< currentNode.getCoordinates() << std::endl;
return i.getCoordinates() == currentNode.getCoordinates(); }
);
В этом нет ошибки компилятора, но элементы, которые возвращают true из вышеприведенного оператора, не будут удалены из вектора;
Я напечатан на экране, например
[5,5]
[5,5]
но openList
остается как было.
std::remove_if
ничего не стирает из вектора, так как не имеет к нему доступа. Вместо этого он перемещает элементы, которые вы хотите сохранить, в начало диапазона, оставляя оставшиеся элементы в допустимом, но неопределенном состоянии, и возвращает новый конец.
Вы можете использовать идиому «стереть-удалить», чтобы фактически стереть их из вектора:
openList.erase(
std::remove_if(
openList.begin(),
openList.end(),
[&](BoardNode& i){return i.getCoordinates() == currentNode.getCoordinates();}),
openList.end());
Я думаю, что вы намерены Удалить предметы из вектора. Но то, что вы делаете, будет не действительно удалить элементы из вектора, что заставляет вас думать, что лямбда не работает. Вам нужно использовать erase()
функция-член в сочетании с std::remove
,
Другими словами, вы должны использовать erase-remove idiom
как:
v.erase(std::remove_if(v.begin(), v.end(), your-lambda-goes-here), v.end());
Удаление выполняется путем перемещения элементов в диапазоне таким образом,
что элементы, которые будут удалены, перезаписываются. Элементы между
старые и новые концы диапазона имеют неопределенные значения. Итератор
на новый конец диапазона возвращается. Относительный порядок
элементы, которые остаются, сохраняются.
http://en.cppreference.com/w/cpp/algorithm/remove
Также проверьте пример по этой ссылке.