2

ベクトルを持つPlaylistクラスがありTracks、それぞれTrackmultimap<long, Note>as データメンバーがあります。

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

次にやりたいことはNotes、 eachの を反復することですTrack。しかし、この部分からすべての出力が停止します。そのため、最初のトラック名しか表示されません。その後の 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

また、Note オブジェクトを追加するために使用している Track クラスのメソッドは次のようになります。

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

イテレータが機能しない理由はありますか?

4

3 に答える 3

4

変化する

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

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

すべてのイテレータが比較よりも小さい/大きいことをサポートしているわけではありません。

c ++ 11を使用している場合は、範囲ベースのforループを使用できます。

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

または、BOOST_FOREACHを使用できます

BOOST_FOREACH (Note& note, trackIT->getNoteList())
于 2012-04-22T17:02:11.853 に答える
0

トラックキーを本当にハードコーディングしている場合、 std::map は一意のキーを格納するため、マップにはトラックが 1 つしかありません...

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

また、よりエレガントなアプローチが必要な場合は、関数オブジェクトを使用できます。

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());
于 2012-04-23T21:14:07.380 に答える
0

getTrackListorの定義を示していませんがgetNoteList、よくある間違いがあります。コンテナへの参照ではなくコピーを返すと、イテレータが別のコンテナを指してしまい、比較が不可能になります。それだけでなく、コンテナは一時的なものであるため、反復子を使用すると未定義の動作が発生します。

于 2012-04-23T21:39:41.733 に答える