2012-04-18 60 views
2

我有一個Playlist類,它具有一個向量Tracks,每個Track有一個multimap<long, Note>作爲datamember。多圖迭代器不工作

class Track { 
private: 
    multimap<long, Note> noteList; 
} 

使用迭代器來存取權限的曲目是沒有問題的,所以在這裏這部分工作正常:

vector<Track>::iterator trackIT; 
    try{ 
     for(noteIT = trackIT->getNoteList().begin(); noteIT != trackIT->getNoteList().end(); noteIT++){ 
      cout << "---" << noteIT->second.getName() << endl; 
     } 
    }catch (int e){ 
     cout << "exception #" << e << endl; 
    } 

我想接下來做的就是重複每個TrackNotes。但從這部分開始,所有輸出都停止。所以我只能看到第一首曲目的名字。之後的任何cout都沒有顯示,編譯器也沒有給我任何錯誤。即使try catch塊內COUT不工作..

vector<Track>::iterator trackIT; 
multimap<long, Note>::iterator noteIT; 
for(trackIT = this->playlist.getTracklist().begin(); trackIT < this->playlist.getTracklist().end(); trackIT++){ 
    cout << trackIT->getTrackName() << endl; 

    for(noteIT = trackIT->getNoteList().begin(); noteIT != trackIT->getNoteList().end(); noteIT++){ 
     cout << "---" << noteIT->second.getName() << endl; 
    } 
} 
cout << "random cout that is NOT shown" << endl; // this part doesn't show up in console either 

而且,在我的田徑類中的方法,我使用添加的註釋對象是這樣的:

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

// I'm adding the notes to the track like this: 
Note note1(440, 100, 8, 1, 1); 
note1.setName("note1"); 
synthTrack.addNote(note1); 

任何想法爲什麼迭代器不會工作?

+1

'Note'的拷貝構造函數可能有問題。 - 類型簽名不應該是'void Track :: addNote(const Note&note)'?或'void Track :: addNote(Note && note)'。 – leftaroundabout 2012-04-18 15:40:14

+0

'this-> curMsr'的價值是什麼? – 2012-04-18 15:46:10

+0

您是否檢查'notesIT'實際上是否在'trackIT-> end()'? 'this-> curMsr'的價值是什麼? – Grizzly 2012-04-18 15:46:19

回答

1

你並沒有顯示出getTrackListgetNoteList的定義,但有一個共同的錯誤的人做 - 如果返回的容器,而不是它的一個引用的副本,迭代器將指向不同的容器使比較不可能。不僅如此,而且由於容器是臨時的,任何使用迭代器都會導致未定義的行爲。

+0

這實際上是問題所在。我公開了我的trackList,並解決了它.. – networkprofile 2012-04-24 00:11:16

5

變化

noteIT < trackIT->getNoteList().end() 

noteIT != trackIT->getNoteList().end() 

並非所有的迭代器支持比比較小於/大。

如果你有C++ 11你可以使用一個for循環基於範圍的:

for (Note& note : trackIT->getNoteList()) 

或者你可以使用BOOST_FOREACH

BOOST_FOREACH (Note& note, trackIT->getNoteList()) 
+0

這消除了我得到的錯誤,但'cout'仍然沒有顯示。輸出在第一個曲目名稱後停止。 – networkprofile 2012-04-22 17:05:07

+0

這是一個iOS應用程序。我不認爲我可以使用C++ 11 – networkprofile 2012-04-22 17:06:14

+0

如果你有一個新的問題與std :: cout,我會說這是一個不同的問題,我們真的希望這個問題變成一個「如何做我修復了我的示例程序中的所有編譯錯誤「? 也沒有看到整個程序,沒有辦法真正診斷問題。你的循環是嵌套的嗎?我不知道... – 2012-04-22 17:09:42

0

如果你真的硬編碼軌道鍵,則會有永遠只能是在地圖上一個軌道,因爲的std ::地圖商店獨特的鍵...

long key = 1000009; //If yo are really doing this, this key is already inserted so it will fail to insert more. 

另外,如果你想升ike一個更優雅的方法,你可以使用函數對象。

struct print_track 
{ 
    void operator()(const Track& track) 
    { 
     cout << track.getTrackName() << endl; 
     std::for_each(track.getNoteList().begin(), track.getNoteList().end(), print_track_name()); 
    } 
}; 

struct print_note_name 
{ 
    void operator()(const std::pair<long,Note>& note_pair) 
    { 
     cout << "---" << note_pair.second.getName() << endl; 
    } 
}; 

//In use... 
std::for_each(playlist.getTracklist().begin(), playlist.getTracklist.end(), print_track()); 
+0

我正在使用multimap,它不需要唯一鍵。 – networkprofile 2012-04-24 00:10:04