std::is_partitioned
![]() | Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
Определено в заголовочном файле <algorithm> | ||
template<class InputIt, class UnaryPredicate > bool is_partitioned( InputIt first, InputIt last, UnaryPredicate p ); | (начиная с C++11) | |
Вернёт true, если все элементы в диапазоне [first, last)
, которые удовлетворяют предикату p
находятся перед всеми элементами, которые этого не делают. Также вернёт true если [first, last)
не содержит в себе элементов.
Содержание |
[править]Параметры
first, last | — | диапазон элементов для проверки |
p | — | унарный предикат, который возвращаетtrue для элементов, которые должны находиться в начале диапазона. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type &a); Присутствие const& в определении не обязательно, но функция не должна модифицировать передаваемые ей объекты. |
Требования к типам | ||
-InputIt должен соответствовать требованиям InputIterator . |
[править]Возвращаемое значение
true, если диапазон [first, last)
пуст или успешно разбивается предикатом p
на две части. Иначе false.
[править]Сложность
В худшем случае std::distance(first, last)
применений p
.
[править]Возможная реализация
template<class InputIt, class UnaryPredicate >bool is_partitioned(InputIt first, InputIt last, UnaryPredicate p){for(; first != last;++first)if(!p(*first))break;for(; first != last;++first)if(p(*first))returnfalse;returntrue;} |
[править]Пример
#include <algorithm>#include <array>#include <iostream> int main(){std::array<int, 9> v ={1, 2, 3, 4, 5, 6, 7, 8, 9}; auto is_even =[](int i){return i %2==0;};std::cout.setf(std::ios_base::boolalpha);std::cout<< std::is_partitioned(v.begin(), v.end(), is_even)<<' '; std::partition(v.begin(), v.end(), is_even);std::cout<< std::is_partitioned(v.begin(), v.end(), is_even)<<' '; std::reverse(v.begin(), v.end());std::cout<< std::is_partitioned(v.begin(), v.end(), is_even);}
Вывод:
false true false
[править]См. также
делит диапазон элементов на две группы (шаблон функции) | |
(C++11) | находит точку раздела разделённого на две группы диапазона (шаблон функции) |