Отфильтровать странные мультикартные значения C++

У меня есть эта мультикарта в моем коде:

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, повторяется только первая заметка и несуществующая.


person Community    schedule 08.08.2012    source источник
comment
Можете ли вы определить, когда мусор впервые появляется на карте?   -  person Wug    schedule 09.08.2012
comment
Я не могу, данные внутри мультикарты не могут быть прочитаны с помощью отладчика xcode, поэтому мне потребовалось так много времени, чтобы даже найти проблему: stackoverflow.com/a/11856217/393964 Но noteList на самом деле является закрытым членом с методом addNote, единственным, который может добавлять к нему элементы. Ключ должен следовать моему шаблону (measureNumber*1000000), а мусорный ключ — нет.   -  person    schedule 09.08.2012


Ответы (1)


Вы неправильно проверяете конец цикла. В частности, нет гарантии, что 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 в качестве предела вашего цикла. Это автоматически обработает конечный случай.

person jahhaj    schedule 08.08.2012