4

我有一个带有 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);
    }
}

当我使用 key 对象运行此代码时,2000001我能够擦除正确的对象,但另一个带有 key 的对象1000017也会被擦除。不过,这两个物体的频率相同。

知道我的 for 循环有什么问题吗?

编辑:为了清楚起见,我只想检查具有一个特定键的对象(在这种情况下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 回答