Стандартный контейнер std :: list имеет двунаправленные итераторы. Оператор - используемый в этом выражении
itr1 = s.end() - 1
определен для итераторов с произвольным доступом. Вместо этого вы можете использовать стандартную функцию std::prev
, объявленную в заголовке <iterator>
, например
itr1 = std::prev( s.end() )
Однако в любом случае функция недопустима, поскольку в общем случае пользователь функции может передать пустой контейнер. В этом случае выражение std::prev( s.end() )
имеет неопределенное поведение.
И оператор <не определен для двунаправленных итераторов. Так что это выражение </p>
itr < itr1
также не может использоваться в функции.
Более того, функция не будет работать с массивами, поскольку массивы не имеют функций-членов, как, например, begin()
.
Функция может выглядеть следующим образом, как показано в демонстрационной программе ниже.
#include <iostream>
#include <iomanip>
#include <string>
#include <deque>
#include <vector>
#include <list>
#include <iterator>
template <typename Container>
bool palindrome( const Container &c )
{
auto first = std::begin( c );
auto last = std::end( c );
while ( first != last && first != --last && *first == *last ) ++first;
return first == last;
}
int main()
{
const std::string word1{ "racecar" };
const std::vector<char> word2{ 'a', 'b', 'b', 'a' };
const std::deque<int> word3{ 83, 84, 65, 84, 83 };
const std::list<int> word4{ 83, 84, 65, 84, 83 };
const char word5[] = { 83, 84, 65, 84, 83 };
std::cout << std::boolalpha << palindrome( word1 ) << '\n';
std::cout << std::boolalpha << palindrome( word2 ) << '\n';
std::cout << std::boolalpha << palindrome( word3 ) << '\n';
std::cout << std::boolalpha << palindrome( word4 ) << '\n';
std::cout << std::boolalpha << palindrome( word5 ) << '\n';
return 0;
}
Вывод программы:
true
true
true
true
true
Если вы хотите, вы можете специализироваться функция для итераторов с произвольным доступом.