5

如果我执行以下代码:

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;
}

我得到这个输出:

17
4
3
2

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

提前致谢 ...

4

2 回答 2

11

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

while(lI != l.constBegin()) {
  --lI;
  std::cout << *lI << std::endl;
}
于 2013-05-08T13:24:24.480 回答
7

尝试

lI = l.constEnd() - 1;

我不确定这是否能解决您的问题,但据我所知,结束迭代器总是指向容器末尾之后的位置。

我只是想在评论中解决您的担忧。当你这样做时:

lI = l.constEnd();

while(lI != l.constBegin()) {
  std::cout << *lI << std::endl;
  --lI;
}

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

但如果你这样做:

lI = l.constBegin();

while(lI != l.constEnd()) {
  std::cout << *lI << std::endl;
  ++lI;
}

同样的事情也会发生,除了循环在到达constEnd. 从逻辑上讲这是有道理的,好像constEnd没有指向容器的末尾,它会切断而不输出 4。

于 2013-05-08T13:03:35.440 回答