28 Algorithms library [algorithms]

28.7 Sorting and related operations [alg.sorting]

28.7.4 Partitions [alg.partitions]

template <class InputIterator, class Predicate> bool is_partitioned(InputIterator first, InputIterator last, Predicate pred); template <class ExecutionPolicy, class ForwardIterator, class Predicate> bool is_partitioned(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, Predicate pred);

Requires: Для перегрузки с нетExecutionPolicy, InputIterator«s тип значения должен быть конвертирован вPredicate» S типа аргумента. Для перегрузки сExecutionPolicy, ForwardIterator«с типом значения должны быть конвертированы вPredicate» S типа аргумента.

Returns:true if [first, last) пуст или если [first, last) разделен наpred, то есть если все элементы, удовлетворяющие условиям,pred появляются перед теми, которые этого не делают.

Complexity: Линейный. В большинствеlast - first приложенийpred.

template<class ForwardIterator, class Predicate> ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred); template<class ExecutionPolicy, class ForwardIterator, class Predicate> ForwardIterator partition(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, Predicate pred);

Requires: ForwardIterator должны удовлетворять требованиям ValueSwappable.

Effects: Помещает все элементы в диапазоне,[first, last) которые удовлетворяют,pred перед всеми элементами, которые ему не удовлетворяют.

Returns: Итератораi таким образом, что для каждого итератораj в диапазоне [first, i)pred(*j) != false, и для каждого итератораk в диапазоне[i, last),pred(*k) == false.

Complexity: ПустьN=last - first:

  • Для перегрузки безExecutionPolicy, как разN применения предиката. В большинствеN/2 случаев меняет местами, еслиForwardIterator соответствует BidirectionalIterator требованиям, и не больше, вN противном случае.

  • Для перегрузки сExecutionPolicy, O(NlogN) свопами иO(N) приложениями предиката.

template<class BidirectionalIterator, class Predicate> BidirectionalIterator stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred); template<class ExecutionPolicy, class BidirectionalIterator, class Predicate> BidirectionalIterator stable_partition(ExecutionPolicy&& exec, BidirectionalIterator first, BidirectionalIterator last, Predicate pred);

Requires: BidirectionalIterator должны удовлетворять требованиям ValueSwappable. Тип*first должен удовлетворять требованиям MoveConstructible и MoveAssignable.

Effects: Помещает все элементы в диапазоне, [first, last) которые удовлетворяют,pred перед всеми элементами, которые ему не удовлетворяют.

Returns: Итератора i таким образом, что для каждого итератора j в диапазоне [first, i), pred(*j) != falseи для каждого итератора k в диапазоне [i, last), pred(*k) == false. Относительный порядок элементов в обеих группах сохраняется.

Complexity: ПустьN =last - first:

  • Для перегрузки без подкачки,ExecutionPolicyсамое большееNlogN подкачки, но толькоO(N) подкачки, если достаточно дополнительной памяти. СобственноN применения сказуемого.

  • Для перегрузки сExecutionPolicy, O(NlogN) свопами иO(N) приложениями предиката.

template <class InputIterator, class OutputIterator1, class OutputIterator2, class Predicate> pair<OutputIterator1, OutputIterator2> partition_copy(InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); template <class ExecutionPolicy, class ForwardIterator, class ForwardIterator1, class ForwardIterator2, class Predicate> pair<ForwardIterator1, ForwardIterator2> partition_copy(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, ForwardIterator1 out_true, ForwardIterator2 out_false, Predicate pred);

Requires:

  • Для перегрузки без каких - либоExecutionPolicy,InputIterator«с типом значение должно бытьCopyAssignable (таблица26), и должны быть доступны для записи ([iterator.requirements.general]) кout_­true иout_­falseOutputIteratorс, и должны быть конвертированы в Predicate» с аргументом типа.

  • Для перегрузки сExecutionPolicy,ForwardIterator«с типом значения должны бытьCopyAssignable, и должны быть доступны для записи на out_­true иout_­falseForwardIteratorс, и должны быть конвертированы вPredicate» с аргументом типа. [ Note: ЕслиForwardIteratorтип значения не является типом значения, это может повлиять на производительностьCopyConstructible. ]end note

  • Для обеих перегрузок входной диапазон не должен перекрываться ни с одним из выходных диапазонов.

Effects: Для каждого итератораi в[first, last)копии*i в начале диапазона выходной мощности с ,out_­true еслиpred(*i) этоtrue, или в диапазоне , начиная с выхода вout_­false противном случае.

Returns: Такая параp , котораяp.first является концом выходного диапазона, начинающегося с,out_­true иp.second является концом выходного диапазона, начинающегося сout_­false.

Complexity: Собственноlast - first приложенияpred.

template<class ForwardIterator, class Predicate> ForwardIterator partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);

Requires:ForwardIteratorТип значения должен быть преобразован вPredicateтип аргумента.[first, last) должны быть разделены наpred, т. е. все элементы, которые удовлетворяют,pred должны появляться перед теми, которые не удовлетворяют .

Returns: Итераторmid такой, чтоall_­of(first, mid, pred) иnone_­of(mid, last, pred) есть обаtrue.

Complexity:O(log(last - first)) приложенияpred.