【发布时间】:2021-03-28 13:32:41
【问题描述】:
我正在尝试在 Qt 中使用 STL 样式的迭代器。当我构建 for 循环时:
for(auto i = list.rbegin(); i != list.rend(); ++i)
{ }
它可以工作,但如果我像这样构建:
for(auto i = list.rend(); i != list.rbegin(); --i)
{ }
它不起作用并给出错误。我想知道为什么我不能从头到尾使用反向迭代器。任何解释或来源都会有所帮助。
#include <QString>
#include <QDebug>
#include <QList>
int main() {
QList<QString> list;
list << "A" << "V" << "C" << "D";
// this works
for(auto i = list.rbegin() ; i != list.rend(); ++i)
{ }
// error: this doesn't work
for(auto i = list.rend(); i != list.rbegin(); --i)
{
*i = i-> toLower();
qDebug() << *i;
}
}
【问题讨论】:
-
这个错误是秘密吗? “它不起作用”没有帮助。
-
除非
QList<...>是奇数,否则迭代本身应该可以工作。访问数据是不同的:反向迭代与正向迭代不是对称的,因为您需要在访问值之前递减。 -
@DietmarKühl Dereferencing a reverse iterator does that for you;问题在于取消引用过去的迭代器。从这个意义上说,它与任何其他类型的迭代器相同。
-
@AsteroidsWithWings
reverse_iterator确实在与前向迭代一起使用时提供了反向视图。悬停,反向迭代,即使用—it而不是++it遍历需要在取消引用(—it)之前执行第一步(*it),以避免访问过去的值-iterator - 与使用的迭代器类型无关。 -
@DietmarKühl 这是正确的,我的回答是这样的;)我认为我们说的是同一件事,但是 OP 对反向迭代器范围进行反向迭代的奇怪选择导致了一些令人困惑的冲突术语:)