我有一些简单的代码。
#include <iostream>
#include <list>
std::list<int> A;
std::list<int> B;
std::list<int>::iterator location;
int main()
{
A.push_back( 1 );
location = A.begin();
B.splice( B.end(), A, A.begin() );
std::cout<< (*location) <<std::endl;
}
编译后我得到运行时错误:列出迭代器而不是可解除引用。我怎么解决这个问题?
答案 0 :(得分:3)
您正在使用的std::splice::list
的重载使C ++ 03中的拼接元素的迭代器无效。来自 23.2.2.4列表操作 [lib.list.ops] :
void splice(iterator position, list<T,Allocator>& x, iterator i);
效果:在列表x之前插入i指向的元素,然后从x中删除元素。如果结果没有改变 position == i或position == ++ i。 仅使迭代器和。无效 对拼接元素的引用。
(强调我的)
因此,在您的情况下,在location
拼接之前使用A.begin()
初始化的{{1}}变为无效。此行为似乎在C ++ 11中已更改,其中保留了迭代器有效性(请参阅working example。)