Namespaces
Variants

std::experimental::ranges:: is_permutation

From ru.cppreference.net
Определено в заголовке <experimental/ranges/algorithm>
template < ForwardIterator I1, Sentinel < I1 > S1, ForwardIterator I2, Sentinel < I2 > S2,

class Pred = ranges:: equal_to <> ,
class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < I1, I2, Pred, Proj1, Proj2 >
bool is_permutation ( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(1) (ranges TS)
template < ForwardRange R1, ForwardRange R2, class Pred = ranges:: equal_to <> ,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
требует IndirectlyComparable < ranges:: iterator_t < R1 > , ranges:: iterator_t < R2 > ,
Pred, Proj1, Proj2 >
bool is_permutation ( R1 && r1, R2 && r2, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(2) (ranges TS)
template < ForwardIterator I1, Sentinel < I1 > S1, class I2,

class Pred = ranges:: equal_to <> ,
class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires ForwardIterator < std:: decay_t < I2 >> && ! Range < I2 > &&
IndirectlyComparable < I1, std:: decay_t < I2 > , Pred, Proj1, Proj2 >
bool is_permutation ( I1 first1, S1 last1, I2 && first2_, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(3) (ranges TS)
(устарело)
template < ForwardRange R1, class I2, class Pred = ranges:: equal_to <> ,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires ForwardIterator < std:: decay_t < I2 >> && ! Range < I2 > &&
IndirectlyComparable < ranges:: iterator_t < R1 > , std:: decay_t < I2 > , Pred, Proj1, Proj2 >
bool is_permutation ( R1 && r1, I2 && first2_, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(4) (ranges TS)
(устарело)
1) Возвращает true если существует перестановка элементов в диапазоне [ first1 , last1 ) , которая делает диапазон равным [ first2 , last2 ) , и false в противном случае.
2) То же, что и (1) , но использует r1 в качестве первого исходного диапазона и r2 в качестве второго исходного диапазона, как если бы использовались ranges:: begin ( r1 ) как first1 , ranges:: end ( r1 ) как last1 , ranges:: begin ( r2 ) как first2 , и ranges:: end ( r2 ) как last2 .
3) То же, что и (1) , за исключением того, что first2 определяется как если бы std:: decay_t < I2 > first2 = std:: forward < I2 > ( first2_ ) ; и last2 равен first2 + ( last1 - first1 ) .
4) То же, что и (3) , но использует r1 в качестве первого исходного диапазона, как если бы использовалось ranges:: begin ( r1 ) в качестве first1 и ranges:: end ( r1 ) в качестве last1 .

Два диапазона считаются равными, если они имеют одинаковое количество элементов и для каждого итератора i в диапазоне [ first1 , last1 ) , ranges:: invoke ( pred, ranges:: invoke ( proj1, * i ) , ranges:: invoke ( proj2, * ( first2 + ( i - first1 ) ) ) ) равно true .

Несмотря на приведённые выше объявления, фактическое количество и порядок параметров шаблона для объявлений алгоритмов не определено. Таким образом, если при вызове алгоритма используются явные аргументы шаблона, программа, вероятно, является непереносимой.

Содержание

Параметры

first1, last1 - первый диапазон элементов
r1 - первый диапазон элементов
first2, last2 - второй диапазон элементов
r2 - второй диапазон элементов
first2_ - начало второго диапазона элементов
pred - предикат, применяемый к проецируемым элементам
proj1 - проекция, применяемая к элементам первого диапазона
proj2 - проекция, применяемая к элементам второго диапазона

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

true если диапазон [ first1 , last1 ) является перестановкой диапазона [ first2 , last2 ) .

Сложность

Не более O(N 2 ) применений предиката и каждой проекции, или ровно N если последовательности уже равны, где N = last1 - first1 .

Однако если SizedSentinel < S1, I1 > && SizedSentinel < S2, I2 > выполняется и last1 - first1 ! = last2 - first2 , никаких применений предиката и проекций не производится.

Пример

См. также

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