列表的有效性在插入后开始迭代器
Validity of list begin iterator after insertion
请考虑以下程序:
#include <list>
#include <cstdio>
int main() {
std::list<int> l;
std::list<int>::iterator it = l.begin();
l.push_back(0);
l.insert(it, 1);
for(const int &i: l) {
printf("%d", i);
}
}
(http://cpp.sh/66giy(
这将打印01
.非常令人惊讶。如果我将列表更改为双端面,它会打印预期的。10
这是一个错误吗?
编辑:deque行为无关紧要,deque的迭代器被push_back无效。
我无法抓住你的问题...好的,让我们尝试重现:
std::list<int> l;
std::list<int>::iterator it = l.begin();
您的迭代器指向什么?到列表的末尾,因为列表是空的!
§23.2.1 [容器.要求.概述] p6
begin()
返回一个迭代器,引用容器中的第一个元素。end()
返回一个迭代器,该迭代器是容器的过去结束值。如果容器为空,则begin() == end()
;
l.push_back(0);
现在,列表包含一个元素。您的迭代器有效,因为列表未使迭代器无效,并且仍指向列表的末尾。
l.insert(it, 1);
现在,您在迭代器之前插入1
,该迭代器仍然指向末尾。所以你的第一个元素是0
,最后一个是1
。
因此,您的输出按预期01
。
也许你期望begin()
提供容器迭代器的固定虚拟启动是错误的?
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 列表的有效性在插入后开始迭代器
- 如何将迭代器(包括结束和开始之前的迭代器)测试到列表或forward_list保持有效
- 为什么 std::variant 使用开始和结束迭代器进行编译?
- Qi::p arse Boost Change开始迭代器
- 从两端开始浏览列表,然后使用迭代器在中间停止
- ->第一个/第二个到空映射迭代器开始
- 如何使用迭代器实现从序列的中间到开始的循环
- 向量模板类:擦除(迭代器开始,迭代器端)
- 如何创建从开始和结束迭代器的范围
- 字符串文本的C++宏开始迭代器和结束迭代器
- Vector::迭代器在与开始比较时崩溃
- map/set迭代器不可递增,我无法从头开始重新启动映射
- 开始,结束简单类的迭代器规范
- 如何返回提升multi_index迭代器的开始和结束
- 使用模板<类输入迭代器>字符串(输入迭代器开始,输入迭代器结束)时出现奇怪的错误;
- C++映射从迭代器位置开始搜索
- 减法或递减随机访问迭代器指向开始
- Vector:<int>:迭代器在设置时使用 begin 时从向量的末尾开始