我有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 );
第二种方法的对称代码。我设法在两个列表之间传输一次,但下一次我收到错误。
任何帮助?
答案 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'尝试增加它而不传递断言。