2016-05-26 4 views
0

"Entry"オブジェクトの7x20 2Dベクトルがあります。 EntryオブジェクトにはIDがあります。私は私のベクトルを反復処理したいと実行します。2Dベクトルの行の要素を削除する - イテレータを使用する

if(idToDelete == entry.getID()) 
    //Delete entry 

は、現在のコードは次のようになります。

for(auto day : entryRegister) 
{ 
    for(auto entry : day) 
    { 
     if(entryID == entry.getID()) 
     { 
      //Delete Entry 
     } 
    } 
} 

私は実際にアイテムを削除する式を策定する方法がわかりませんよ。私はentryRegister[day].erase(entry)をやってみましたが、角括弧内のイテレータを取る演算子が見つからないため、エラーが発生します。

私はEntryRegisterの宣言の要求を見ました。関連情報は、次のように宣言されているということです:vector< vector<Entry> >と7つの列があり、それぞれ最大20行あります。

のgetIdこれは私は削除するIDを渡す機能の一部である

1〜70のいずれかの値であり、unsigned char型を返します。私はその後、レジスタを繰り返し、そのIDを持つエントリを削除します。

+1

'entryRegister'と' day'の宣言を見てみましょう。そして、あなたが 'getID()'と同じことは、あなた自身の関数を 'deleteID()'の背後に書くことはできませんか? –

答えて

3

それは一般的にerase-remove idiomとして知られている2つの以上の基本的な手順で行うことができるので、C++は、機能ベクトルで「値の削除」を持っていません。

  1. に等しいベクトル内のすべての項目を検索値、及びeraseは、1回のまたは2つの反復子をとることを注意std::vector::erase

を使用して、これらの見つかった項目を削除するベクトルのサイズを変更std::remove or remove_if

  • を使用して、ベクトルの終わりにそれらを交換します。既にその位置を知っていた項目を消去することしかサポートしていません。

    for (auto& day : entryRegister) { 
        auto erase_begin = std::remove_if(
           day.begin(), 
           day.end(), 
           [=](const Entry& entry) { return entry.EntryID() == entryID; } 
        ); 
        day.erase(erase_begin, day.end()); 
    } 
    

    私が参照によってdayを取得するためにentryRegisterループを変更し、その変更はなく、実際にコピーの本当の日に影響を与えることに注意してください。

  • 関連する問題