Namespaces
Variants

std:: stable_partition

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
stable_partition
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовке <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 .
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true .

(до C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true .

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

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

(до 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
исправлено
требование

Смотрите также

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