🍿
std::partition — Разделение данных по условию🔥
Проблема: Разработчикам часто нужно разделить коллекцию на две группы: элементы, удовлетворяющие условию, и остальные. Ручная реализация требует дополнительных контейнеров или сложной логики с несколькими проходами по данным.
💡Решение: Алгоритм
std::partition переупорядочивает элементы так, что все удовлетворяющие предикату оказываются в начале. Возвращает итератор на границу разделения.
✏️
Пример кода:#include <algorithm>
#include <vector>
std::vector<int> numbers = {1, 5, 2, 8, 3, 9, 4, 7, 6};
// Разделяем на четные и нечетные
auto boundary = std::partition(numbers.begin(), numbers.end(),
[](int n) {
return n % 2 == 0; // Четные в начало
}
);
// Теперь numbers = {6, 4, 2, 8, 3, 9, 5, 7, 1}
// boundary указывает на первый нечетный элемент
// Обрабатываем только четные числа
for (auto it = numbers.begin(); it != boundary; ++it) {
*it *= 2; // Удваиваем четные
}
🍨
Преимущества: • Эффективность: работает in-place без дополнительной памяти O(1)
• Скорость: линейная сложность O(n) за один проход
• Стабильность: существует
std::stable_partition для сохранения порядка
• Универсальность: подходит для любых типов данных с произвольным предикатом
Библиотека C/C++ разработчика
#буст