gpt4 book ai didi

C++ STL : Trouble with iterators

转载 作者:太空宇宙 更新时间:2023-11-04 14:38:39 25 4
gpt4 key购买 nike

我有一个新手问题:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com