1

我正在尝试遍历我的多重映射中的每个元素,但由于某种原因,它在遍历前两个元素后停止工作。

这是我用来迭代的代码:

    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));
}

多图可以多次使用相同的键,因此现在每个键都是相等的,但这无关紧要。有什么想法我可能做错了吗?

编辑

这是一个正在运行的示例。遗憾的是,这个示例按原样工作,并显示了添加到 noteList 的三个注释。然而,上面的代码不起作用,我不知道为什么。

4

1 回答 1

0

从键盘示例中,您的问题在于您在循环中调用的getTracklist()方式for

每次调用时,它都会getTracklist()返回. 因此,通过在循环内部进行操作,您可以将迭代器从带有迭代器的一个副本与.tracklisttrackIT < playlist.getTracklist().end()fortracklisttracklist

摆脱这种情况的安全方法是tracklist在循环之前复制到局部变量for并使用它:

vector<Track> tracklist(playlist.getTracklist());
for(trackIT = tracklist.begin(); trackIT != tracklist.end(); ++trackIT){


另一种方法是保持for循环不变,但将 getter 更改为tracklist

vector<Track>& getTracklist() { return tracklist; }

通过返回对 的引用tracklist,您将迭代器与相同的实际对象进行比较。但是,这种方式风险更大,可能只能作为最后的手段使用。


<顺便说一句,使用, prefer 比较迭代器通常不是一个好计划!=。这在这里有效,因为容器是 a std::vector,但是如果您将来更改为不同的容器类型,这可能会导致未定义的行为。

于 2012-04-24T16:36:53.060 回答