我有一个新手问题:
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/