1

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

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 个列表之间转移项目一次,但下一次我得到了错误。

有什么帮助吗?

4

2 回答 2

3

std::list使用的swap成员函数可以轻松有效地完成此操作:

list1.swap(list2);

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

于 2013-02-10T23:35:13.780 回答
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()将指向不存在的 10,而您不需要(不能)擦除。这个 '<code>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' 尝试递增它不通过断言。

于 2013-02-11T00:53:28.277 回答