C++ 多重映射迭代器不工作

C++ 多重映射迭代器不工作,c++,iterator,multimap,C++,Iterator,Multimap,我有一个Playlist类,它有一个带有曲目的向量,每个曲目都有一个multimap作为datamember class Track { private: multimap<long, Note> noteList; } 此外,我的Track类中用于添加Note对象的方法如下所示: void Track::addNote(Note &note) { long key = 1000009; this->noteList.insert(make_p

我有一个Playlist类,它有一个带有曲目的向量,每个曲目都有一个multimap作为datamember

class Track {
private:
    multimap<long, Note> noteList;
}
此外,我的Track类中用于添加Note对象的方法如下所示:

void Track::addNote(Note &note) {
    long key = 1000009;
    this->noteList.insert(make_pair(key, note));
}

// I'm adding the notes to the track like this:
Note note1(440, 100, 8, 1, 1);
note1.setName("note1");
synthTrack.addNote(note1);
你知道迭代器为什么不能工作吗?

更改

noteIT < trackIT->getNoteList().end()
并非所有迭代器都支持小于/大于比较

如果您有c++11,则可以使用基于范围的for循环:

for (Note& note : trackIT->getNoteList())
或者您可以使用BOOST_FOREACH

BOOST_FOREACH (Note& note, trackIT->getNoteList())
改变

并非所有迭代器都支持小于/大于比较

如果您有c++11,则可以使用基于范围的for循环:

for (Note& note : trackIT->getNoteList())
或者您可以使用BOOST_FOREACH

BOOST_FOREACH (Note& note, trackIT->getNoteList())

如果您确实在硬编码轨迹关键点,那么地图中将只有一个轨迹,因为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());

如果您确实在硬编码轨迹关键点,那么地图中将只有一个轨迹,因为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());


您还没有显示getTrackList或getNoteList的定义,但是人们通常会犯一个错误——如果您返回容器的副本而不是对它的引用,迭代器将指向不同的容器,从而无法进行比较。不仅如此,由于容器是临时的,任何迭代器的使用都会导致未定义的行为。

您没有显示getTrackList或getNoteList的定义,但是人们通常会犯一个错误-如果您返回容器的副本而不是对其的引用,迭代器将指向不同的容器,从而无法进行比较。不仅如此,由于容器是临时的,任何迭代器的使用都会导致未定义的行为。

Note的复制构造函数可能有问题。-类型签名不应该是void Track::addNoteconst Note&Note吗?或者作废Track::addNoteNote&¬e。这个->curMsr的值是多少?您是否检查了notesIT是否实际位于trackIT->end?这个->curMsr的值是多少?当你调用addNote时,你使用1000009作为键。搜索时,使用的是1000000的倍数。不太可能从中获取1000009键,因此您一直都在获取trackIT->end。trackIT->end不在容器中,包含未定义的数据。此->curMsr为1,因此迭代器应指向第一个便笺。便笺的复制构造函数可能有问题。-类型签名不应该是void Track::addNoteconst Note&Note吗?或者作废Track::addNoteNote&¬e。这个->curMsr的值是多少?您是否检查了notesIT是否实际位于trackIT->end?这个->curMsr的值是多少?当你调用addNote时,你使用1000009作为键。搜索时,使用的是1000000的倍数。不太可能从中获取1000009键,因此您一直都在获取trackIT->end。trackIT->end不在您的容器中,并且包含未定义的数据。this->curMsr是1,因此迭代器应该指向第一个注释这删除了我得到的错误,但是cout仍然没有显示。输出在第一个曲目名称后停止。这是针对iOS应用程序的。我不认为我可以使用C++11。如果你对std::cout有新的问题,我会说这是一个不同的问题,我们真的希望这个问题变成一个问题吗?我该如何修复示例程序中的所有编译错误?此外,如果没有看到整个程序,就无法真正诊断问题。你的循环是嵌套的吗?我不知道…是的,我的循环是嵌套的。实际上,在提到任何编译器错误之前,我首先询问了cout。我认为问题出在noteIT=trackIT->getNoteList.begin;如果您想让任何人都能够以一种理智的方式诊断此问题,您需要发布一个包含嵌套循环的代码段,以及您声称未执行的对std::out的调用。这删除了我收到的错误,但cout仍然没有显示。输出在第一个曲目名称后停止。这是针对iOS应用程序的。我不认为我可以使用C++11。如果你对std::cout有新的问题,我会说这是一个不同的问题,我们真的希望这个问题变成一个问题吗?我该如何修复示例程序中的所有编译错误?此外,如果没有看到整个程序,就无法真正诊断问题。你的循环是嵌套的吗?我不知道…是的,我的循环是嵌套的。实际上,在提到任何编译器错误之前,我首先询问了cout。我认为问题出在noteIT=trackIT->getNoteList.begin;如果你想让任何人都能以一种理智的方式诊断这个问题,你需要发布一个包含嵌套循环的代码段,以及你声称没有执行的对std::out的调用。这实际上就是问题所在。我把我的曲目列表公之于众,这就解决了问题。这就是问题所在。我公开了我的跟踪列表,这就解决了问题。。