multimap仅显示两个第一个元素

时间:2012-04-24 00:27:35

标签: c++ iterator multimap

我试图迭代我的​​多图中的每个元素但由于某种原因它在经过前两个元素后停止工作。

这是我用来迭代的代码:

    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 &note) {
//  long key = note.getMeasureNumber() * 1000000 + note.getStartTime();
    long key = 1000009;
    this->noteList.insert(make_pair(key, note));
}

多图可以多次使用相同的密钥,所以现在每个密钥都相同,但这不重要。我有什么想法可能做错了吗?

修改

Here's a running example。遗憾的是,这个例子可以正常工作,并显示添加到noteList的三个音符。但是上面的代码不起作用,我不明白为什么。

1 个答案:

答案 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,但如果将来更改为其他容器类型,这可能会导致未定义的行为。