Файл заголовка 'is_palindrome.hpp' содержит шесть вариантов одного алгоритма, is_palindrome. Алгоритм проверяет последовательность и возвращает истинность, если последовательность является палиндромом; то есть она идентична при прохождении либо назад, либо вперед.
Рутина— это палиндром
принимает последовательность и, необязательно, предикат. Он вернётся истинным, если предикат вернётся истинным для тестируемых элементов алгоритмом в последовательности.
Обычай состоит из 6 форм; для определения диапазона требуется два итератора. Вторая форма требует двух итераторов для определения диапазона и предиката. Третья форма принимает один параметр диапазона и использует Boost. Диапазон, чтобы пройти его. Четвертая форма принимает один параметр диапазона (используется Boost). Дальность его прохождения) и предикат. Пятая форма принимает одну C-струну и предикат. Шестая форма состоит из одной C-струны.
Функция— палиндром
возвращает истинное, если предикат возвращает истинное любое проверенное элементами алгоритма в последовательности. Существует шесть версий: 1) принимает два итератора. 2) берет два итератора и предикат. 3) принимает диапазон. 4) принимает диапазон и предикат. 5) принимает C-струну и предикат. 6) принимает C-струну.
template<typename BidirectionalIterator>
bool is_palindrome ( BidirectionalIterator begin, BidirectionalIterator end );
template<typename BidirectionalIterator, typename Predicate>
bool is_palindrome ( BidirectionalIterator begin, BidirectionalIterator end, Predicate p );
template<typename Range>
bool is_palindrome ( const Range &r );
template<typename Range, typename Predicate>
bool is_palindrome ( const Range &r, Predicate p );
template<typename Predicate>
bool is_palindrome ( const char* str, Predicate p );
bool is_palindrome(const char* str);
Учитывая контейнеры: const std::listempty, const std::vectorsingleElement{'z'}, int oddNonPalindrome[] = {3,2,2}, const int oddPalindrome[] = {1,2,3,2,1}, const int evenPalindrome[] = {1,2,2,1}, int evenNonPalindrome[] = {1,4,8,8}, то
is_palindrome(empty)) --> true
is_palindrome(singleElement)) --> true
is_palindrome(std::begin(oddNonPalindrome), std::end(oddNonPalindrome))) --> false
is_palindrome(std::begin(evenPalindrome), std::end(evenPalindrome))) --> true
is_palindrome(empty.begin(), empty.end(), functorComparator())) --> true
is_palindrome(std::begin(oddNonPalindrome), std::end(oddNonPalindrome), funcComparator<int>)) --> false
is_palindrome(std::begin(oddPalindrome), std::end(oddPalindrome)) --> true
is_palindrome(evenPalindrome, std::equal_to<int>())) --> true
is_palindrome(std::begin(evenNonPalindrome), std::end(evenNonPalindrome)) --> false
is_palindrome("a") --> true
is_palindrome("aba", std::equal_to<char>()) --> true
is_palindrome
work on Bidirectional and RandomAccess iterators.
Все варианты— это
запускаются вO(N)(линейное) время; то есть они сравниваются с каждым элементом в списке один раз. Если какое-либо из сравнений не увенчается успехом, алгоритм немедленно прекратит работу, не изучив оставшиеся элементы последовательности.
Все вариантыis_palindrome
берут свои параметры по значению, указателю const или ссылке const и не зависят от какого-либо глобального состояния. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения.
is_palindrome
Returns true for empty ranges, const char* null pointers and for single element ranges.- Если вы используете версию «is_palindrome» без пользовательского предиката, «is_palindrome» использует по умолчанию «оператор ==()» для элементов.
- Будьте осторожны с использованием не нулевого указателя «const char*» без «\0» - если вы используете его с «is_palindrome», это неопределенное поведение.