创建一个列表:
list<int> l;
auto it = l.begin();
l.emplace(it, 0);
/*it =*/ l.emplace(it, 1);
/*it =*/ l.emplace(it, 2);
在这里打印
for (auto it : l)
cout << it << endl; // 0 1 2
cout << "nn";
cout << *it << endl; // = 3
为什么*it
是3而不是0?
这一行:
auto it = l.begin();
列表中还没有任何内容,所以开始也是结束。
std::list::emplace()
在给定迭代器之前插入项,因此这一行:
l.emplace(it, 0);
将0
放在it
之前,即插入到列表末尾。
std::list
也有一些最宽容的迭代器失效规则,并且it
迭代器在将项插入列表时不会失效。当新的项被添加到列表中时,it
继续引用列表的末尾。
最后,这一行:
cout << *it << endl;
取消引用"end"迭代器,这是不允许的。结果是undefined,在本例中,它似乎包含值3。也许如果你添加另一个项目,那么它看起来包含4,也许你看到的是list
的一个隐藏的具体实现细节。或者计算机崩溃或会坏的鼻恶魔。