【问题标题】:multimap only showing two first elements多图只显示两个第一个元素
【发布时间】:2012-04-24 00:27:35
【问题描述】:

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

这是我用来迭代的代码:

    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 的三个注释。然而,上面的代码不起作用,我不知道为什么。

【问题讨论】:

  • 如果您发布一个最小的完整示例,我们会有更好的机会。
  • 特别是,最好能看到多图模板参数,以及您为Note 定义的operator&lt; 函数......
  • 没有operator&lt; 功能,因为我不需要订购多图。我将添加一个工作示例
  • 这是一个工作示例。可悲的是,简化的示例确实有效,但是在两个 Note 对象与 cout 一起显示后,我的项目其余部分中的代码停止了...我不知道是什么原因造成的
  • 这是进步!尝试一个中间案例,简化了大约一半。很快我们就会解决这个问题。

标签: c++ iterator multimap


【解决方案1】:

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

每次调用getTracklist(),它都会返回tracklist副本。因此,通过在for 循环中执行trackIT &lt; playlist.getTracklist().end(),您可以将来自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 的引用,您将迭代器与相同的实际对象进行比较。然而,这种方式风险更大,可能只能作为最后的手段。


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

【讨论】:

  • 我刚刚发现问题出在吸气剂上,但感谢您解释为什么它会破坏代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多