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

Ale*_*ing 5 c++ iterator stdlist

考虑以下程序:

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

http://cpp.sh/66giy

这打印01. 非常令人惊讶。如果我将列表更改为双端队列,它会打印预期的10.

这是一个错误吗?

编辑:双端队列行为是不相关的,双端队列的迭代器被push_back无效。

Kla*_*aus 3

我无法理解你的问题...好吧,让我们尝试重现:

\n
std::list<int> l;\nstd::list<int>::iterator it = l.begin();\n
Run Code Online (Sandbox Code Playgroud)\n

你的迭代器指向什么?到列表末尾,因为列表是空的!

\n
\n

\xc2\xa723.2.1 [container.requirements.general] p6

\n

begin()返回引用容器中第一个元素的迭代器。end()返回一个迭代器,它是容器的最后值。如果容器是空的,则begin() == end()

\n
\n
l.push_back(0);\n
Run Code Online (Sandbox Code Playgroud)\n

现在列表包含一个元素。您的迭代器是有效的,因为列表没有使迭代器无效并且仍然指向列表的末尾。

\n
l.insert(it, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

1现在,您在仍指向末尾的迭代器之前插入。所以你的第一个元素是 a 0,最后一个元素是 a 1

\n

所以你的输出01符合预期。

\n

也许您期望提供begin()容器迭代器的固定虚拟启动是完全错误的?

\n