Iterator在拼接列表后存储错误的值

时间:2014-08-12 05:45:50

标签: c++ visual-studio-2008 iterator

我有一些简单的代码。

#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;
}

编译后我得到运行时错误:列出迭代器而不是可解除引用。我怎么解决这个问题?

1 个答案:

答案 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。)