4

1つのオブジェクトのみを削除したいNoteオブジェクトを含むマルチマップがあります。同じキーを持つ複数のNoteオブジェクトが存在する可能性があります。問題は、現在、指定したキー範囲内にないオブジェクトも削除されていることです。

long key = note.measureNumber * 1000000 + note.startTime; // = 2000001
multimap<long, Note>::iterator it;
for (it = noteList.lower_bound(key); it != noteList.end() && it->first < (key + 1); it++) {
    if(it->second.frequency == note.frequency){
        noteList.erase(it);
    }
}

このコードをキーを使用して実行すると2000001、正しいオブジェクトを消去できますが、キーを使用して別のオブジェクト1000017も消去されます。ただし、両方のオブジェクトの頻度は同じです。

私のforループの何が問題になっていますか?

編集:明確にするために、私は1つの特定のキー(この場合)を持つオブジェクトのみをチェックしたいので2000001、イテレーターがそのキーとは異なるキーを持つオブジェクトを調べる必要はありません。

4

3 に答える 3

2

イテレータを指定してerase()を呼び出すと無効になるため、引き続き使用することはできません。

std :: multimap <>からアイテムが削除された後も、イテレータを引き続き使用できますかを参照してください。

于 2012-08-21T20:04:22.220 に答える
1

イテレータを消去すると無効になります。マップを反復処理しているときにマップから消去する場合は、コードを変更する必要があります。これを試して:

multimap<long, Note>::iterator it;
for (it = noteList.lower_bound(key); it != noteList.end() && it->first < (key + 1);) {
    if(it->second.frequency == note.frequency){
        noteList.erase(it++);
    }
    else
    {
        ++it;
    }
}
于 2012-08-21T20:05:30.533 に答える
0

ここですでに示したように、イテレータを消去すると無効になります。私はあなたが持っているコードのいくつかの非効率性を指摘したいと思います:あなたはループの終わりまで繰り返す必要はありません。このことを考慮:

for (it = noteList.lower_bound(key); it != noteList.upper_bound(key) && it->first == key; it++)
{
    if(it->second.frequency == note.frequency)
    {
       noteList.erase(it++);
    }
    else
    {
        ++it;
    }
}
于 2012-08-21T21:23:37.120 に答える