我有一个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
为什么迭代器不起作用的任何想法?
答案 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)
您没有显示getTrackList
或getNoteList
的定义,但是人们常犯了一个错误 - 如果您返回容器的副本而不是对它的引用,那么迭代器将是指向不同的容器使得比较不可能。不仅如此,由于容器是临时的,任何迭代器的使用都会导致不确定的行为。