2013-05-08 100 views
1

如果我执行下面的代码:迭代一个向后的QList

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>,但我真的不明白为什么这不起作用!

在此先感谢...

+1

在第一次迭代中,您将解引用一个结束迭代器。这些都是不可忽略的,而且你正在调用未定义的行为。 – jrok 2013-05-08 13:04:32

+0

然后我不明白为什么它会以相反的方式工作!如果将lI设置为constBegin,则更改if条件以请求constEnd,并在每次迭代中递增迭代器,然后获得正确的输出。 – janr 2013-05-08 13:11:13

+3

'begin()'==第一个元素,'end()'==一个结尾。这就是为什么它以相反的方式工作。 – cmannett85 2013-05-08 13:15:06

回答

3

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

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

尝试

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.

+0

谢谢,这并不能完全解决我的问题,但我想出了一个解决方案。你必须改变递减的位置。我会在一个新的答案中加入这个... – janr 2013-05-08 13:18:02

+1

lI = l.constEnd() - 1;是一个错误。如果列表为空,l.constBegin()== l.constEnd(),所以你不应该使用l.constEnd() - 1,除非你确定列表不是空的。 – Alexey 2013-09-25 06:59:49