找到Palindromes的这两个功能之间的区别

Moi*_*oin 1 c++

我写了一个函数来检查一个单词是否是回文,但是"意外",该函数失败得非常严重,这里是:

bool isPalindrome (const string& s){
 string reverse = "";
 string original = s;
 for (string_sz i = 0; i != original.size(); ++i){
  reverse += original.back();
  original.pop_back();
 }

 if (reverse == original)
  return true;
 else
  return false;
}
Run Code Online (Sandbox Code Playgroud)

当你传入一个只包含一个字符的字符串时,它给了我"字符串迭代器偏移超出范围错误",即使我们传入一个空字符串(虽然我知道它是因为反向变量的初始化),并且当你传入一个未分配的字符串,例如:

string input;
isPalindrome(input);
Run Code Online (Sandbox Code Playgroud)

后来,我发现了一个更好的功能,它可以像你期望的那样工作:

bool found(const string& s)
{
 bool found = true;
 for (string::const_iterator i = s.begin(), j = s.end() - 1; i < j; ++i, --j) {
  if (*i != *j)
   found = false;
 }
 return found;
}
Run Code Online (Sandbox Code Playgroud)

与第一个函数不同,当您为其指定未分配的字符串变量或空字符串并且适用于单个字符等时,此函数会正确失败...

所以,堆栈溢出的好人请指出我为什么第一个功能如此糟糕......

谢谢.

Jam*_*lis 5

for (string_sz i = 0; i != original.size(); ++i) {
    reverse += original.back();
    original.pop_back();
}
Run Code Online (Sandbox Code Playgroud)

original.size()从后面弹出元素时更改.实际上,你继续递增i和递减original.size(); 他们可能永远不会平等.

if (reverse == original)
Run Code Online (Sandbox Code Playgroud)

这将永远不会成立,因为您刚刚从中删除了所有元素original并以相反的顺序添加它们reverse. original此时将永远是空的.