Namespaces
Variants

std::stable_partition

Из ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы по диапазонам (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Операции над последовательностями без изменения    
Пакетные операции
(C++17)
Операции поиска
Операции изменения последовательностей
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции бинарного поиска
(по разбитым диапазонам)
Операции над множествами (по отсортированным диапазонам)
Операции слияния (по отсортированным диапазонам)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения(C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определён в заголовке <algorithm>
template< class BidirIt, class UnaryPred >
BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPred p );
(1) (constexpr начиная с C++26)
template< class ExecutionPolicy, class BidirIt, class UnaryPred >
BidirIt stable_partition( ExecutionPolicy&& policy,
                          BidirIt first, BidirIt last, UnaryPred p );
(2) (начиная с C++17)
1) Переупорядочивает элементы в диапазоне [first, last) таким образом, что все элементы, для которых предикат p возвращает true, предшествуют элементам, для которых предикат p возвращает false. Относительный порядок элементов сохраняется.
2) То же, что и (1), но выполняется согласно policy.
Эта перегрузка участвует в разрешении перегрузок только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)

Если выполняется любое из следующих условий, поведение не определено:

  • Тип *first не является Swappable.
(до C++11)
(начиная с C++11)

Параметры

first, last - пара итераторов, определяющих диапазон элементов для переупорядочивания
policy - политика выполнения для использования
p - унарный предикат, который возвращает ​ true если элемент должен быть упорядочен перед другими элементами.

Выражение p ( v ) должно быть преобразуемо в bool для каждого аргумента v типа (возможно const) VT , где VT - это тип значения BidirIt , независимо от категории значения , и не должно изменять v . Таким образом, тип параметра VT & не допускается , как и VT , за исключением случаев, когда для VT перемещение эквивалентно копированию (since C++11) . ​

Требования к типам
-
BidirIt должен удовлетворять требованиям LegacyBidirectionalIterator .
-
UnaryPred должен удовлетворять требованиям Predicate .

Возвращаемое значение

Итератор на первый элемент второй группы.

Сложность

Дано N как std:: distance ( first, last ) :

1) Ровно N применений p .
O(N) обменов, если достаточно дополнительной памяти, в противном случае не более N⋅log 2 (N) обменов.
2) O(N) применений p .
N⋅log(N) обменов.

Исключения

Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение и ExecutionPolicy является одним из стандартных политик , std::terminate вызывается. Для любой другой ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удается выделить память, std::bad_alloc выбрасывается.

Примечания

Эта функция пытается выделить временный буфер. Если выделение завершается неудачей, выбирается менее эффективный алгоритм.

Реализации в libc++ и libstdc++ также принимают диапазоны, обозначенные LegacyForwardIterator s в качестве расширения.

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr стабильная сортировка ( 1 )

Пример

#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v{0, 0, 3, -1, 2, 4, 5, 0, 7};
    std::stable_partition(v.begin(), v.end(), [](int n) { return n > 0; });
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Вывод:

3 2 4 5 7 0 0 -1 0

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2150 C++98 std::stable_partition требовалось только разместить один
элемент, удовлетворяющий p перед одним элементом, не удовлетворяющим p
исправлено
требование

Смотри также

делит диапазон элементов на две группы
(шаблон функции & функциональный объект алгоритма)
делит элементы на две группы, сохраняя их относительный порядок в каждой группе
(функциональный объект алгоритма)