2012-04-24 55 views
1

我想每一個元素遍歷在我的多重映射,但由於某種原因,它停止工作,它會比前兩個元素之後。多重映射只顯示了兩個第一要素

這是我使用迭代代碼:

for(noteIT = trackIT->noteList.begin(); noteIT != trackIT->noteList.end(); noteIT++){ 
     cout << "noteList size is: " << (int) trackIT->noteList.size() << endl; 
     cout << "---" << noteIT->second.getName() << endl; 
    } 

這是我得到的輸出:

noteList size is: 3 
---note1 
noteList size is: 3 
---note2 

但有我的多重映射內兩個以上的元素,我米將他們在這裏:

// create notes 
Note note1(440, 100, 8, 1, 1); 
note1.setName("note1"); 
Note note2(220, 100, 8, 1, 9); 
note2.setName("note2"); 
Note note3(880, 100, 8, 1, 17); 
note3.setName("note3"); 

synthTrack.addNote(note1); 
synthTrack.addNote(note2); 
synthTrack.addNote(note3); 

這是addNote方法是什麼樣子:

void Track::addNote(Note &note) { 
// long key = note.getMeasureNumber() * 1000000 + note.getStartTime(); 
    long key = 1000009; 
    this->noteList.insert(make_pair(key, note)); 
} 

一個multimap可以有幾次相同的密鑰,所以現在每個密鑰都是平等的,但這應該不重要。任何想法我可能做錯了什麼?

編輯

Here's a running example。可悲的是,這個例子按照它應該的方式工作,並顯示了添加到noteList的三個註釋。上面的代碼不起作用,我不知道爲什麼。

+2

如果您發佈了一個最小的完整示例,我們將有更好的機會。 – Beta 2012-04-24 00:35:49

+0

特別是,這將是很好看的多重映射模板參數,和'運營商你'Note'定義<'函數.... – 2012-04-24 00:44:43

+0

沒有'運營商<'功能,因爲我不需要多重映射爲訂購。我將添加一個工作示例 – networkprofile 2012-04-24 00:52:42

回答

1

從鍵盤例如,你的問題就出在你的for循環中調用getTracklist()的方式。

每次調用getTracklist()時,會返回一個副本tracklist。所以做trackIT < playlist.getTracklist().end()for循環內,你從tracklist一個副本一個迭代的tracklist不同的副本比較迭代器。

您安全的出路,這是for循環之前tracklist複製到一個局部變量和使用:

vector<Track> tracklist(playlist.getTracklist()); 
for(trackIT = tracklist.begin(); trackIT != tracklist.end(); ++trackIT){ 


另一種選擇是離開你for循環原樣,但將您的吸氣劑tracklist更改爲:

vector<Track>& getTracklist() { return tracklist; } 

通過返回參考文獻如果您想將迭代器與相同的實際對象進行比較,則可以使用tracklist。但是,這種方式更有風險,應該只能作爲最後的手段使用。


順便說一下,通常不會比較使用<的迭代器,更喜歡!=。這適用於此,因爲容器是std::vector,但如果將來更改爲其他容器類型,則可能會導致未定義的行爲。

+0

我有隻是想出了問題是與吸氣劑,但感謝解釋爲什麼它打破了代碼。 – networkprofile 2012-04-24 17:13:57

相關問題