使用反向迭代器的中点

时间:2019-08-12 09:49:39

标签: c++ c++11 iterator

使用反向迭代器实现回文

代码错误为“运算符/”,未为迭代器定义

bool isPalindrome( std::string & s)
{
    bool check = ( s == std::string{ s.rbegin(), s.rend() } );
    return check;    // works fine
}
上面的

个比较。 (n=s.length

s == string{ s.rbegin(), s.rbegin() + (s.rend()/2) } 
         /* error: operator/ not defined */

我期望通过floor(n/2)比较可以进行一两行回文检查。 有没有精美的代码。我是否缺少有关反向迭代器的东西?

std::string{"cac"}的输入应返回true,并且需要进行1次比较

如何使用反向迭代器在O(1)时间内获得中点

2 个答案:

答案 0 :(得分:3)

将迭代器除以数字实际上没有任何意义。您可以做的就是获得一个迭代器,该迭代器可以像容器长度的一半那样前进:

string{s.rbegin(), std::next(s.rbegin(), s.size() / 2)}

std::next将迭代器增加提供的次数后获得迭代器。

O(1)仅对于std::vectorstd::arraystd::string等连续容器有效。

答案 1 :(得分:0)

您混淆了使用该元素的索引引用该元素的内容。只要考虑一下s.rend()/2的含义。您真正想要的是两个索引之间的差异除以2。

给出两个迭代器,您可以通过std::distance来获得它们的距离。