C++ STL : Trouble with iterators

标签 c++ syntax type-safety

我有一个新手问题:

bool _isPalindrome(const string& str)
{
    return _isPalindrome(str.begin(), str.end()); // won't compile
}

bool _isPalindrome(string::iterator begin, string::iterator end)
{
    return begin == end || *begin == *end && _isPalindrome(++begin, --end);
}

我在这里做错了什么?为什么 str.begin() 没有被类型检查为 string::iterator

更新:更好的版本:

bool BrittlePalindrome::_isPalindrome(string::const_iterator begin, string::const_iterator end)
{
    return begin >= end || *begin == *(end - 1) && _isPalindrome(++begin, --end);
}

最佳答案

假设您在第一个函数之前声明了第二个函数,主要问题是您通过 const 引用传递字符串。

这意味着您可以访问的 begin()end() 的唯一重载是返回 std::string 的 const 版本: :const_iterator 而不是 std::string::iterator

迭代器的约定是结束迭代器指向超出范围末尾的一个并且不可取消引用 - 当然如果您将 str.end() 作为 end 参数。这意味着 *begin == *end 无效,您需要先将 end 递减一次。您还会遇到元素数量为奇数的范围的问题。通过执行 ++begin--end 而不进一步检查您的迭代器可能会在递归中交叉而不是触发 begin == end条件。

另请注意,为了获得最大的可移植性,全局标识符不应以下划线开头。

关于C++ STL : Trouble with iterators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925352/

相关文章:

rest - Go语言中的坟墓

php - 在 jquery ajax url 中包含 $_SERVER 文件路径的语法?

javascript - 被赋予异步函数并且 .then() 是否不同

c# - 使用泛型实现类型安全的枚举模式

c++ - 由于参数变量中的 %s,sprintf 崩溃

c++ - 为连接的 OMNeT++ 门分配随机选择但匹配的参数?

c++ - 在 C++ 标识符中使用下划线的规则是什么?

java - 我们能否利用类型系统来使程序更加安全?

javascript - 联合接口(interface)类型上不存在属性

typescript - 为什么 Typescript 在索引到不可索引的类型时不会报错,有没有办法让它这样做?