我试图迭代我的多图中的每个元素但由于某种原因它在经过前两个元素后停止工作。
这是我用来迭代的代码:
for(noteIT = trackIT->noteList.begin(); noteIT != trackIT->noteList.end(); noteIT++){
cout << "noteList size is: " << (int) trackIT->noteList.size() << endl;
cout << "---" << noteIT->second.getName() << endl;
}
这是我得到的输出:
noteList size is: 3
---note1
noteList size is: 3
---note2
但是我的多重图中有两个以上的元素,我在这里添加它们:
// create notes
Note note1(440, 100, 8, 1, 1);
note1.setName("note1");
Note note2(220, 100, 8, 1, 9);
note2.setName("note2");
Note note3(880, 100, 8, 1, 17);
note3.setName("note3");
synthTrack.addNote(note1);
synthTrack.addNote(note2);
synthTrack.addNote(note3);
这就是addNote方法的样子:
void Track::addNote(Note ¬e) {
// long key = note.getMeasureNumber() * 1000000 + note.getStartTime();
long key = 1000009;
this->noteList.insert(make_pair(key, note));
}
多图可以多次使用相同的密钥,所以现在每个密钥都相同,但这不重要。我有什么想法可能做错了吗?
修改
Here's a running example。遗憾的是,这个例子可以正常工作,并显示添加到noteList的三个音符。但是上面的代码不起作用,我不明白为什么。
答案 0 :(得分:0)
从键盘示例中,您的问题在于您在getTracklist()
循环中调用for
的方式。
每次致电getTracklist()
时,都会返回tracklist
的副本。因此,通过在trackIT < playlist.getTracklist().end()
循环中执行for
,您将从tracklist
的一个副本与迭代器的迭代器与tracklist
的不同副本进行比较。
您可以安全地将tracklist
复制到for
循环之前的局部变量并使用它:
vector<Track> tracklist(playlist.getTracklist());
for(trackIT = tracklist.begin(); trackIT != tracklist.end(); ++trackIT){
另一种方法是按原样保留for
循环,但将tracklist
的getter更改为:
vector<Track>& getTracklist() { return tracklist; }
通过返回对tracklist
的引用,您将把迭代器与同一实际对象进行比较。但是,这种方式风险更大,应该只能作为最后的手段使用。
顺便说一句,使用<
比较迭代器通常不是一个好的计划,更喜欢!=
。这可以在这里工作,因为容器是std::vector
,但如果将来更改为其他容器类型,这可能会导致未定义的行为。