Итерация по std :: vector с лямбдой не хочет удалять с помощью remove_if

У меня небольшая проблема с лямбда-выражением при использовании 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 остается как было.

2

Решение

std::remove_if ничего не стирает из вектора, так как не имеет к нему доступа. Вместо этого он перемещает элементы, которые вы хотите сохранить, в начало диапазона, оставляя оставшиеся элементы в допустимом, но неопределенном состоянии, и возвращает новый конец.

Вы можете использовать идиому «стереть-удалить», чтобы фактически стереть их из вектора:

openList.erase(
std::remove_if(
openList.begin(),
openList.end(),
[&](BoardNode& i){return i.getCoordinates() == currentNode.getCoordinates();}),
openList.end());
10

Другие решения

Я думаю, что вы намерены Удалить предметы из вектора. Но то, что вы делаете, будет не действительно удалить элементы из вектора, что заставляет вас думать, что лямбда не работает. Вам нужно использовать erase() функция-член в сочетании с std::remove,

Другими словами, вы должны использовать erase-remove idiom как:

v.erase(std::remove_if(v.begin(), v.end(), your-lambda-goes-here), v.end());
3

Удаление выполняется путем перемещения элементов в диапазоне таким образом,
что элементы, которые будут удалены, перезаписываются. Элементы между
старые и новые концы диапазона имеют неопределенные значения. Итератор
на новый конец диапазона возвращается. Относительный порядок
элементы, которые остаются, сохраняются.

http://en.cppreference.com/w/cpp/algorithm/remove

Также проверьте пример по этой ссылке.

0
По вопросам рекламы [email protected]