Идиома Erase-Remove_if для удаления пар
При попытке использовать идиому Erase-Remove_if для удаления пар из std::vector>, возникает своеобразная проблема. Несмотря на то, что пары со значением .first, равным 4, предназначены для удаления, первоначальная реализация оставляет дублирующую пару:
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
Корень проблемы лежит в неполном процессе стирания. std::erase_if сдвигает соответствующие элементы только к концу вектора; он их не удаляет. Чтобы завершить удаление, правильный подход — использовать итератор, возвращаемый std::remove_if, в качестве отправной точки для удаления:
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }), stopPoints.end());
Понимание механизма Erase-Remove_if:
Для получения дополнительной информации обратитесь к статье Википедии о [Идиома стереть-удалить](https://en.wikipedia.org/ wiki/Erase-remove_idiom).
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3