1

私は2つのstd::listsを持っています。リスト1からすべてのアイテムを削除して2番目に挿入し、その逆も行います。コードが機能していません(アクセス違反が発生し、「リストイテレータが参照解除できません」)

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番目の方法の対称コード。一度は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 に答える