Question

I have this multimap in my code:

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));
}

I'm encountering problems when I try to read the notes from the last measure. In this case the song has only 8 measures and it's measure number 8 that causes problems. If I go up to 16 measures it's measure 16 that causes the problem and so on.

// (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
}

I have only added one note to the 8th measure and yet this is the result I'm getting in console:

_______________________________________________________
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

This keeps repeating. The first result is a correct note which I've added myself but I have no idea where the note with ID: 1 is coming from.

Any ideas how to avoid this? This loop gets stuck repeating the same two results and I can't get out of it. Even if there are several notes within measure 8 (so that means several values within the multimap that start with 8xxxxxx it only repeats the first note and the non-existand one.

Was it helpful?

Solution

You aren't checking for the end of your loop correctly. Specifically there is no guarantee that noteIT does not equal trackIT->noteList.end(). Try this instead

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

For the look of it, it might be better to use some call to upper_bound as the limit of your loop. That would handle the end case automatically.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top