如何理解这个C ++回文代码?

时间:2017-06-06 21:39:55

标签: c++ algorithm palindrome

我最近解决了回文问题,但我不明白这部分代码是如何工作的(使用rbegin和rend)。有人可以向我解释一下吗?

#include <iostream>
#include <string>

using namespace std;
bool checkPalindrome(string);
int main()
{
    string inputString = "palindrom";
    cout << checkPalindrome(inputString);
return 0;
}

bool checkPalindrome(std::string inputString)
{
   return (inputString == string(inputString.rbegin(), inputString.rend()));
}

3 个答案:

答案 0 :(得分:6)

看一下字符串构造函数:

    ...
    (7) template <class InputIterator>
    string  (InputIterator first, InputIterator last);

您可以看到可以通过迭代器创建一个字符串。 rbegin / rend迭代器是InputIterators,指向它们引用的反向位置:

    rend() -->"My string"<-- rbegin()

那就是说,当你将rbegin()和rend()传递给字符串构造函数时,它会从结尾迭代到字符串的开头,创建倒置的字符串:

    iteration 0: "g"    (currentIterator = rbegin()   : push("g")
    iteration 1: "n"    (currentIterator = rbegin()+1 : push("n")
    iteartion 2: "i"    (currentIterator = rbegin()+2 : push("i")
    ...
    iteration 8: "M"    (currentIterator = rbegin()+8 : push("M")
    iteration 9: rend() (currentIterator = rend()     : stop iteration)

最后,运算符==()将检查字符串的等价性。

答案 1 :(得分:1)

string::rbegin(反向开始)是反向字符串开头的迭代器(字符串的最后一个字符),string::rend(反向结束)是反向字符串结尾的迭代器(第一个字符)你的字符串)。

字符串构造函数可以期望两个迭代器创建一个新字符串,第一个字符串将是字符串的开头,第二个字符串将结束。

当您向inputString的反向开始和反向结束传递给构造函数时,它正在创建一个inputString的反向字符串。

答案 2 :(得分:0)

基本上,你正在倒转inputString,然后检查两个字符串是否仍然相等。

rbegin()rend()是反向迭代器。有一个字符串构造函数,它以开始和结束迭代器作为参数。

所有string(inputString.rbegin(), inputString.rend())都返回inputString的反向。