std::is_permutation
![]() |
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
Определено в заголовочном файле <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 > bool is_permutation( ForwardIt1 first, ForwardIt1 last, |
(1) | (начиная с C++11) |
template< class ForwardIt1, class ForwardIt2, class BinaryPredicate > bool is_permutation( ForwardIt1 first, ForwardIt1 last, |
(2) | (начиная с C++11) |
[first1, last1)
, что делает этот диапазон равный диапазоне начиная с d_first
. Первый вариант используется operator==
за равноправие, вторая версия использует бинарный p
предикат[first1, last1)
that makes that range equal to the range beginning at d_first
. The first version uses operator==
for equality, the second version uses the binary predicate p
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Содержание |
[править] Параметры
first, last | — | диапазон элементов для сравнения
Оригинал: the range of elements to compare Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
d_first | — | В начале второго диапазона для сравнения
Оригинал: the beginning of the second range to compare Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
p | — | бинарный предикат, который возвращает true если элементы следует считать равными. Определение функции предиката должно быть эквивалентно следующему: bool pred(const Type1 &a, const Type2 &b); Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты. |
Требования к типам | ||
-ForwardIt1, ForwardIt2 должен соответствовать требованиям ForwardIterator .
|
[править] Возвращаемое значение
[first, last)
является перестановкой диапазоне начиная с d_first
.[first, last)
is a permutation of the range beginning at d_first
.Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Сложность
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Возможная реализация
template<class ForwardIt1, class ForwardIt2> bool is_permutation(ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first) { // skip common prefix std::tie(first, d_first) = std::mismatch(first, last, d_first); // iterate over the rest, counting how many times each element // from [first, last) appears in [d_first, d_last) if (first != last) { ForwardIt2 d_last = d_first; std::advance(d_last, std::distance(first, last)); for (ForwardIt1 i = first; i != last; ++i) { if (i != std::find(first, i, *i)) continue; // already counted this *i auto m = std::count(d_first, d_last, *i); if (m==0 || std::count(i, last, *i) != m) { return false; } } } return true; } |
[править] Пример
#include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> v1{1,2,3,4,5}; std::vector<int> v2{3,5,4,1,2}; std::cout << "3,5,4,1,2 is a permutation of 1,2,3,4,5? " << std::boolalpha << std::is_permutation(v1.begin(), v1.end(), v2.begin()) << '\n'; std::vector<int> v3{3,5,4,1,1}; std::cout << "3,5,4,1,1 is a permutation of 1,2,3,4,5? " << std::boolalpha << 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
[править] См. также
генерирует следующую большую лексикографическую перестановку диапазона элементов (шаблон функции) | |
генерирует следующую меньшую лексикографическую перестановку диапазона элементов (шаблон функции) |