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)
这打印01
. 非常令人惊讶。如果我将列表更改为双端队列,它会打印预期的.10
这是一个错误吗?
编辑:双端队列行为是不相关的,双端队列的迭代器被push_back无效。
我无法理解你的问题...好吧,让我们尝试重现:
\nstd::list<int> l;\nstd::list<int>::iterator it = l.begin();\n
Run Code Online (Sandbox Code Playgroud)\n你的迭代器指向什么?到列表末尾,因为列表是空的!
\n\n\n\xc2\xa723.2.1 [container.requirements.general] p6
\n\n
begin()
返回引用容器中第一个元素的迭代器。end()
返回一个迭代器,它是容器的最后值。如果容器是空的,则begin() == end()
;
l.push_back(0);\n
Run Code Online (Sandbox Code Playgroud)\n现在列表包含一个元素。您的迭代器是有效的,因为列表没有使迭代器无效并且仍然指向列表的末尾。
\nl.insert(it, 1);\n
Run Code Online (Sandbox Code Playgroud)\n1
现在,您在仍指向末尾的迭代器之前插入。所以你的第一个元素是 a 0
,最后一个元素是 a 1
。
所以你的输出01
符合预期。
也许您期望提供begin()
容器迭代器的固定虚拟启动是完全错误的?
归档时间: |
|
查看次数: |
763 次 |
最近记录: |