std:: is_permutation
|
Определено в заголовке
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
bool
is_permutation
(
ForwardIt1 first1, ForwardIt1 last1,
|
(1) |
(начиная с C++11)
(constexpr начиная с C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPredicate
>
|
(2) |
(начиная с C++11)
(constexpr начиная с C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
bool
is_permutation
(
ForwardIt1 first1, ForwardIt1 last1,
|
(3) |
(начиная с C++14)
(constexpr начиная с C++20) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPredicate
>
|
(4) |
(начиная с C++14)
(constexpr начиная с C++20) |
Проверяет, является ли
[
first1
,
last1
)
перестановкой
диапазона, начинающегося с
first2
:
- Для перегрузок (1,2) второй диапазон содержит std:: distance ( first1, last1 ) элементов.
-
Для перегрузок
(3,4)
второй диапазон представляет собой
[first2,last2).
Если
ForwardIt1
и
ForwardIt2
имеют различные
типы значений
, программа является некорректной.
Если функция сравнения не является отношением эквивалентности , поведение не определено.
Содержание |
Параметры
| first1, last1 | - | пара итераторов, определяющих первый диапазон элементов для сравнения |
| first2, last2 | - | пара итераторов, определяющих второй диапазон элементов для сравнения |
| p | - |
бинарный предикат, который возвращает
true
если элементы следует считать равными.
Сигнатура функции-предиката должна быть эквивалентна следующей: bool pred ( const Type1 & a, const Type2 & b ) ;
Хотя сигнатура не обязана иметь
const
&
, функция не должна модифицировать передаваемые ей объекты и должна быть способна принимать все значения типа (возможно, const)
|
| Требования к типам | ||
-
ForwardIt1, ForwardIt2
должны удовлетворять требованиям
LegacyForwardIterator
.
|
||
Возвращаемое значение
true
если диапазон
[
first1
,
last1
)
является перестановкой диапазона
[
first2
,
last2
)
,
false
в противном случае.
Сложность
Дано N как std:: distance ( first1, last1 ) :
) сравнений в худшем случае.
) применений в худшем случае.
ForwardIt1
и
ForwardIt2
оба являются
LegacyRandomAccessIterator
, и
last1
-
first1
!
=
last2
-
first2
равно
true
, никаких сравнений произведено не будет.
) сравнений в худшем случае.
) применений в худшем случае.
Возможная реализация
template<class ForwardIt1, class ForwardIt2> bool is_permutation(ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first) { // пропустить общий префикс std::tie(first, d_first) = std::mismatch(first, last, d_first); // перебрать оставшуюся часть, подсчитывая, сколько раз каждый элемент // из [first, last) встречается в [d_first, d_last) if (first != last) { ForwardIt2 d_last = std::next(d_first, std::distance(first, last)); for (ForwardIt1 i = first; i != last; ++i) { if (i != std::find(first, i, *i)) continue; // этот *i уже был проверен auto m = std::count(d_first, d_last, *i); if (m == 0 || std::count(i, last, *i) != m) return false; } } return true; } |
Примечание
Функция
std::is_permutation
может использоваться в
тестировании
, а именно для проверки корректности алгоритмов перестановки (например, сортировки, перемешивания, разделения). Если
x
является исходным диапазоном и
y
является
переставленным
диапазоном, то
std
::
is_permutation
(
x, y
)
==
true
означает, что
y
состоит из
"тех же"
элементов, возможно находящихся на других позициях.
Пример
#include <algorithm> #include <iostream> template<typename Os, typename V> Os& operator<<(Os& os, const V& v) { os << "{ "; for (const auto& e : v) os << e << ' '; return os << '}'; } int main() { static constexpr auto v1 = {1, 2, 3, 4, 5}; static constexpr auto v2 = {3, 5, 4, 1, 2}; static constexpr auto v3 = {3, 5, 4, 1, 1}; std::cout << v2 << " is a permutation of " << v1 << ": " << std::boolalpha << std::is_permutation(v1.begin(), v1.end(), v2.begin()) << '\n' << v3 << " is a permutation of " << v1 << ": " << std::is_permutation(v1.begin(), v1.end(), v3.begin()) << '\n'; }
Вывод:
{ 3 5 4 1 2 } is a permutation of { 1 2 3 4 5 }: true
{ 3 5 4 1 1 } is a permutation of { 1 2 3 4 5 }: false
Смотрите также
|
генерирует следующую большую лексикографическую перестановку диапазона элементов
(шаблон функции) |
|
|
генерирует следующую меньшую лексикографическую перестановку диапазона элементов
(шаблон функции) |
|
|
(C++20)
|
указывает, что
relation
накладывает отношение эквивалентности
(концепт) |
|
(C++20)
|
определяет, является ли последовательность перестановкой другой последовательности
(функциональный объект алгоритма) |