multimap迭代器无法正常工作

时间:2012-04-18 15:35:50

标签: c++ iterator multimap

我有一个Playlist类,其中包含Tracks的向量,每个Track都有一个multimap<long, Note>作为数据库。

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的{​​{1}}。但是从这一部分开始,所有输出都会停止。所以我只能看到第一首曲目的名字。之后的任何cout都没有显示,编译器没有给我任何错误。即使是try catch块内的cout也无法运行..

Track

另外,我用来添加Note对象的Track类中的方法如下所示:

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

为什么迭代器不起作用的任何想法?

3 个答案:

答案 0 :(得分: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())

答案 1 :(得分: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());

答案 2 :(得分:0)

您没有显示getTrackListgetNoteList的定义,但是人们常犯了一个错误 - 如果您返回容器的副本而不是对它的引用,那么迭代器将是指向不同的容器使得比较不可能。不仅如此,由于容器是临时的,任何迭代器的使用都会导致不确定的行为。