Перенос элементов по условию без потери порядка
std::stable_partition переставляет диапазон так, чтобы элементы, удовлетворяющие предикату, оказались перед остальными. При этом относительный порядок внутри обеих групп сохраняется.
#include <algorithm>
#include <vector>
std::vector<int> values{5, 2, 7, 4, 9, 6};
auto middle = std::stable_partition(
values.begin(), values.end(),
[](int value) { return value % 2 == 0; });
// Сначала чётные: 2, 4, 6; затем нечётные: 5, 7, 9.Итератор middle указывает на начало второй группы. Поэтому диапазон можно обработать отдельно, не вычисляя размер первой части вручную. Алгоритму нужны двунаправленные итераторы; для вектора это условие выполняется.
Чем отличается от partition
std::partition обычно быстрее и может использовать меньше дополнительной памяти, но не сохраняет порядок внутри групп. Выбирайте стабильную версию, когда последовательность имеет смысл — например, нужно сначала показать приоритетные записи, сохранив порядок поступления каждой группы. Если порядок не важен, обычный partition часто предпочтительнее.
Оба алгоритма переставляют элементы на месте. Если исходный порядок нужно сохранить отдельно, сначала скопируйте диапазон или постройте новую последовательность.