列表的有效性在插入后开始迭代器

Validity of list begin iterator after insertion

本文关键字:开始 迭代器 插入 有效性 列表      更新时间:2023-10-16

请考虑以下程序:

#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()提供容器迭代器的固定虚拟启动是错误的?