首页 > 解决方案 > 为什么向后列表迭代不显示在列表头之前插入的节点?

问题描述

我正在努力使用以下代码:

 list<int> numbers;
 numbers.push_back(1);
 numbers.push_back(2);
 numbers.push_back(3);
 numbers.push_front(0);


 list<int>::iterator it = numbers.begin();
 numbers.insert(it, 100); 

 for(list<int>::iterator it=numbers.begin(); it != numbers.end(); it++)
 {
    cout << *it << endl;
 }

输出>>100 0 1 2 3

但是当反向迭代时:

list<int>::iterator itBack = numbers.end();

for(; itBack != numbers.begin(); itBack--)
{
   cout << *itBack << endl;
}

输出>>5 3 2 1 0

那5个是哪来的?为什么没有编号为 100 的元素?

提前致谢

标签: c++linked-liststl

解决方案


您在这里遇到的问题是end()is't 不会返回指向列表中最后一项的迭代器,而是指向列表中最后一项之后的项。这允许以下代码

for(list<int>::iterator it=numbers.begin(); it != numbers.end(); it++)

为列表中的每个项目运行,并且仅在迭代器指向列表末尾之后退出......因此打印每个元素。对于反向演员

itBack != numbers.begin()

您到达列表的第一个元素时,这将变得不真实,因此不会运行它。正如评论中提到的那样,尝试 deferenceend()具有未定义的行为,因为您正在有效地在数组之外进行索引。


推荐阅读