2012-08-08 2 views
0

내 코드에서이 multimap은이 : 나는 문제가 발생하고있어필터 이상한 C++ multimap에 값

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으로 시작하는 멀티 맵 내의 여러 값을 의미 함)

+0

쓰레기 전나무 지도에 t가 표시됩니까? – Wug

+0

나는 멀티 맵 내부의 데이터를 xcode 디버거로 읽을 수 없다. 그래서 문제를 찾기까지 너무 오래 걸렸다. http://stackoverflow.com/a/11856217/393964 noteList 실제로 'addNote' 메쏘드를 가진 private 멤버입니다. 오직 하나의 엘리먼트 만 추가 할 수 있습니다. 키는 내 패턴 (measureNumber * 1000000)을 따라야하며 쓰레기 키는 그렇지 않습니다. – networkprofile

답변

1

루프의 끝을 확인하지 않고 있습니다. 올바르게. 특히 noteIT이 동일하지 않는다는 것을 보장은 없습니다 trackIT->noteList.end(). 당신의 루프의 한계로 UPPER_BOUND 일부 전화를 사용하는 것이 더 좋을 수도, 그것의 모양은이 대신

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

을보십시오. 즉 처리 할 것 자동 종료 케이스

+0

그랬습니다. 고맙습니다! – networkprofile