c++ - 为什么向后列表迭代不显示在列表头之前插入的节点?
问题描述
我正在努力使用以下代码:
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 的元素?
提前致谢
解决方案
您在这里遇到的问题是end()
is't 不会返回指向列表中最后一项的迭代器,而是指向列表中最后一项之后的项。这允许以下代码
for(list<int>::iterator it=numbers.begin(); it != numbers.end(); it++)
为列表中的每个项目运行,并且仅在迭代器指向列表末尾之后退出......因此打印每个元素。对于反向演员
itBack != numbers.begin()
当您到达列表的第一个元素时,这将变得不真实,因此不会运行它。正如评论中提到的那样,尝试 deferenceend()
具有未定义的行为,因为您正在有效地在数组之外进行索引。
推荐阅读
- javascript - Vue JS - 有条件地设置开始年份和结束年份下拉列表
- regex - 以可选模式停止正则表达式搜索
- vba - 在一个文本框中搜索日期时,如何在 vba 中编码一个 sql 字符串以在我的 MS Access 表单中使用大于或小于符号
- kotlin - Gradle 中的多个 github 包
- syntax - 将带有变量的哈巴狗标记存储到变量中(不重复)
- python - 有没有办法使用熊猫中的范围来选择系列的元素?
- machine-learning - 意大利语上下文/语义搜索的BERT问题
- sql - 如何从geojson中删除少于4个值的坐标
- java - Modelmapper 跳过对象字段
- metal - MetalKit 掩蔽两个四边形