2

我有一个Playlist类,它有一个向量,Tracks每个Track都有一个multimap<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;
    }

我接下来要做的是迭代Noteseach 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 存储唯一键......

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 回答