向后迭代QList

jan*_*anr 2 c++ qt iterator

如果我执行以下代码:

QList<int> l;
QList<int>::const_iterator lI;

l.append(1);
l.append(2);
l.append(3);
l.append(4);
lI = l.constEnd();

while(lI != l.constBegin()) {
  std::cout << *lI << std::endl;
  --lI;
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

17
4
3
2
Run Code Online (Sandbox Code Playgroud)

我已经通过使用它解决了它QListIterator<int>,但我真的不明白为什么这不起作用!

提前致谢 ...

小智 7

尝试

lI = l.constEnd() - 1;
Run Code Online (Sandbox Code Playgroud)

我不确定这是否能解决你的问题,但据我所知,结束迭代器始终指向一个超过容器的末尾.

我只是想在评论中解决你的问题.当你这样做:

lI = l.constEnd();

while(lI != l.constBegin()) {
  std::cout << *lI << std::endl;
  --lI;
}
Run Code Online (Sandbox Code Playgroud)

从容器的末尾开始,循环永远不会到达constBegin.那是因为当你减少时,lI变成constBegin并且while循环不执行.(这就是为什么1永远不输出.)

但如果你这样做:

lI = l.constBegin();

while(lI != l.constEnd()) {
  std::cout << *lI << std::endl;
  ++lI;
}
Run Code Online (Sandbox Code Playgroud)

同样的事情发生了,除了循环一旦到达就终止constEnd.逻辑上它是有道理的,好像constEnd没有指向容器的末端,它会切断而不输出4.

  • lI = l.constEnd()-1; 是一个错误。如果列表为空,则l.constBegin()== l.constEnd(),因此除非确定列表不为空,否则永远不要使用l.constEnd()-1。 (2认同)

jan*_*anr 6

感谢您的帮助,我不知道end()没有指向最后一个元素。因此,只需要在使用节点值之前递减即可。

while(lI != l.constBegin()) {
  --lI;
  std::cout << *lI << std::endl;
}
Run Code Online (Sandbox Code Playgroud)