过滤奇怪的C ++多图值

时间:2012-08-08 21:18:30

标签: c++ multimap garbage

我的代码中有这个多图:

multimap<long, Note> noteList;

// notes are added with this method. measureNumber is minimum `1` and doesn't go very high
void Track::addNote(Note &note) {
    long key = note.measureNumber * 1000000 + note.startTime;
    this->noteList.insert(make_pair(key, note));
}

当我尝试阅读上一个测量中的音符时,我遇到了问题。在这种情况下,歌曲只有8个小节,而它的小节数8会导致问题。如果我采取了16项措施,那就是导致问题的措施16,等等。

// (when adding notes I use as key the measureNumber * 1000000. This searches for notes within the same measure)
for(noteIT = trackIT->noteList.lower_bound(this->curMsr * 1000000); noteIT->first < (this->curMsr + 1) * 1000000; noteIT++){
if(this->curMsr == 8){
    cout << "_______________________________________________________" << endl;
    cout << "ID:" << noteIT->first << endl;
    noteIT->second.toString();
    int blah = 0;
}

// code left out here that processes the notes
}

我只在第8项指标中添加了一个注释,但这是我在控制台中获得的结果:

_______________________________________________________
ID:8000001
note toString()
Duration: 8
Start Time: 1
Frequency: 880
_______________________________________________________
ID:1
note toString()
Duration: 112103488
Start Time: 44
Frequency: 0    
_______________________________________________________
ID:8000001
note toString()
Duration: 8
Start Time: 1
Frequency: 880
_______________________________________________________
ID:1
note toString()
Duration: 112103488
Start Time: 44
Frequency: 0

这一直在重复。第一个结果是我自己添加的正确注释,但我不知道ID: 1的注释来自何处。

任何想法如何避免这种情况?这个循环被卡住重复相同的两个结果,我无法摆脱它。即使在度量8中有多个音符(这意味着多图中的多个值以8xxxxxx开头,它只重复第一个音符和不存在的一个音符。

1 个答案:

答案 0 :(得分:0)

您没有正确检查循环的结束。具体而言,无法保证noteIT不等于trackIT->noteList.end()。试试这个

for (noteIT = trackIT->noteList.lower_bound(this->curMsr * 1000000); 
    noteIT != trackIT->noteList.end() &&
    noteIT->first < (this->curMsr + 1) * 1000000;
    ++noteIT)
{

从外观上看,最好使用一些对upper_bound的调用作为循环的限制。这将自动处理最终案例。