列出迭代器擦除“调试断言失败”

时间:2013-02-10 23:31:34

标签: c++ list iterator

我有2个std :: lists。我想删除列表1中的所有项目并将其插入第二个,反之亦然。我的代码不起作用(获取访问冲突和“列出迭代器而不是dereferencable”)

for ( std::list<Item *>::iterator it = list1.begin(); it != list1.end(); ++it ) {
        it = list1.erase( it ); 
        list2.push_back( *it ); 
    }
it = list1.begin();
it = list2.erase( it ); // because the last element is not deleted in the above loop
list2.push_back( *it ); 

第二种方法的对称代码。我设法在两个列表之间传输一次,但下一次我收到错误。

任何帮助?

2 个答案:

答案 0 :(得分:3)

使用std::list的{​​{3}}成员函数

可轻松有效地完成此操作
list1.swap(list2);

这具有恒定的时间复杂性。

答案 1 :(得分:0)

当然你必须使用list::swap。 但是你的代码显示你有一些误解。

for ( std::list<Item *>::iterator it = list1.begin(); it != list1.end(); ++it ) {
   it = list1.erase( it ); // this effectively erase and destroy *it, 
                 // and erase() return an iterator to the NEXT element. 
                 // Now it=it+1
   list2.push_back( *it ); // you copy the NEXT element!!  
   // here is where we efectively get the ++it of the 'for'. 
   // When erase was used when ‘it’ was at end()-1, erase return end()
   // The attempt to do it=end()+1 is an error probably detected by an assertion. 
}

如果list1最初具有偶数个元素,例如0,1,2,3,4,5,6,7,8,9,则迭代器end()将指向不存在的元素,你不需要(不能)擦除。这个'for'将删除偶数元素(0,2,4,6,8),并复制到list2奇数(1,3,5,7,9)。但如果最初list1有奇数元素,例如0,1,2,3,4,5,6,7,8,则最后删除的是8,erase返回不存在的迭代器9 = end(),和'for'尝试增加它而不传递断言。