Namespaces
Variants

std::experimental::ranges:: is_permutation

From 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 , никаких применений предиката и проекций не производится.

Пример

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

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