Вы можете использовать std::equal
, чтобы проверить, равен ли список с начала списку с конца. Страница cppreference для std :: equal даже содержит пример для этого.
EDIT (по запросу): на основе примера, предоставленного cppreference:
std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());
строка выше проверяет, является ли строка палиндромом. Но в нашем случае это не будет работать, так как begin()
списка возвращает BidirectionalIterator
, а не RandomAccessIterator
строки *1011*, поэтому мы не можем выполнить s.begin() + s.size()/2
часть. Чтобы заставить его работать, мы должны изменить наш код на:
bool is_palindrome(const std::list<int>& l) //use templated version std::list<T> if needed
{
return std::equal(l.begin(), l.end(), l.rbegin());
}
Это, конечно, не идеально, так как он выполняет итерацию от начала до конца списка, хотя он может просто заканчиваться после середины, но это просто и работает.