首页 > 解决方案 > 如何检查 C++ STL 列表是否为回文?

问题描述

我想检查给定的 C++ STL 列表是否是回文的?

bool isPalindromic(list <int> c);

int main(){

 list<int> l;
l.push_front(12);
l.push_front(35);
l.push_front(34);
l.push_front(35);
l.push_front(12);

isPalindromic(l);
}

output : true 

标签: c++stl

解决方案


您可以使用std::equal检查从头开始的列表是否等于从尾端开始的列表。std::equal的cppreference 页面甚至有一个例子。

编辑(根据要求):基于 cppreference 提供的示例:

std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());

上面的行检查一个字符串是否是回文。但在我们的例子中它不起作用,因为列表的begin()返回BidirectionalIterator,而不是RandomAccessIterator字符串的begin(),所以我们不能做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());
}

这当然不是完美的,因为它从列表的开头迭代到结尾,虽然它可能只是在中间结束,但它很简单并且有效。


推荐阅读