gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:23:24 29 4
gpt4 key购买 nike

考虑以下程序:

#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 .

这是一个错误吗?

编辑:双端队列行为无关紧要,双端队列的迭代器由 push_back 无效。

最佳答案

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

std::list<int> l;
std::list<int>::iterator it = l.begin();
你的迭代器指向什么?到列表末尾为列表为空!

§23.2.1 [container.requirements.general] p6

begin() returns an iterator referring to the first element in the container. end() returns an iterator which is the past-the-end value for the container. If the container is empty, then begin() == end();

l.push_back(0);
现在列表包含一个元素。您的迭代器是有效的,因为列表没有使迭代器无效并且仍然指向列表的末尾。
l.insert(it, 1);
现在你插入 1在仍然指向结尾的迭代器之前。所以你的第一个元素是 0最后一个是 1 .
所以你的输出是 01正如预期的那样。
也许你的期望是 begin()提供容器迭代器的固定虚拟启动是错误的吗?

关于c++ - 插入后列表开始迭代器的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59974821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com