【问题标题】:How to use std::string_view with reverse iterators?如何将 std::string_view 与反向迭代器一起使用?
【发布时间】: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


【解决方案1】:

您不需要std::string_view 来执行此操作。

要实现您的方法 - 将字符串与其反向进行比较 - 您可以使用 std::equal

bool is_palidrome(const std::string& s)
{
    return std::equal( begin(s), end(s), rbegin(s) );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2010-10-27
    • 2013-05-19
    • 1970-01-01
    • 2019-08-09
    • 2017-07-27
    相关资源
    最近更新 更多