我正在尝试创建一个非常简单的函数:
bool is_palidrome(const std::string& s)
{
std::string r(s.crbegin(), s.crend());
return s==r;
}
为了避免不必要的分配我想我可以使用字符串视图:
bool is_palidrome(const std::string& s)
{
std::string_view r(s.crbegin(), s.crend());
return s==r;
}
然而,由于编译器找不到合适的构造函数,最后一个函数无法编译(我尝试了g++12.2和clang++15.0(。为什么在std::string_view r(s.cbegin(), s.cend());
完美工作的情况下没有构造函数?我检查标准https://en.cppreference.com/w/cpp/string/basic_string_view/basic_string_view但我看不出哪个条件不满足。
首先,最好将参数设置为std::string_view
(这样就可以在没有任何额外分配的情况下覆盖文本和std::字符串(。
然后你只需要检查一半的范围,并使用算法std::equal
(就像在其他答案中一样(。
bool is_palidrome(std::string_view s)
{
return std::equal(begin(s), begin(s) + size(s) / 2, rbegin(s));
}
注意ADL允许跳过某些std::
。
您不需要std::string_view
来执行此操作。
要实现您的方法——将整个字符串与其反向字符串进行比较——您可以使用std::equal
。
bool is_palindrome(const std::string& s)
{
return std::equal( begin(s), end(s), rbegin(s) );
}