【发布时间】:2022-10-07 00:29:39
【问题描述】:
我正在尝试创建一个非常简单的函数:
bool is_palidrome(const std::string& s)
{
std::string r(s.crbegin(), s.crend());
return s==r;
}
为了避免不必要的分配 我以为我可以使用 string_view:
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,但看不到哪个条件不满足。
-
string_view 只在现有的连续缓冲区上。它应该如何工作?
-
我的评论可能很愚蠢,但如果 [a,b] 是连续的,那么 [b,a] 也不是吗?
-
检查回文的最常见方法之一是使用简单的循环,从开头和结尾进行索引,并比较各个字符,直到索引相互通过。它实际上比比较更有效,因为在最坏的情况下(它是一个回文),使用
==的比较将比较所有的字符串,而上述循环只会比较一半字符串。 -
关于 [b,a] 的事情,计算机不是这样工作的。缓冲区需要在一个方向(从 a 前进到 b)。你不能像那样在太空中倒退。
-
完整的错误消息和命令行可能有助于阐明一些问题,可能是没有构造函数从 operator== 所需的 string_view 创建字符串
标签: c++ language-lawyer stdstring string-view