我正在调试我的代码,有一次我有一个多重映射,其中包含一对 long
和一个 Note 对象
,创建如下:
void Track::addNote(Note ¬e) {
long key = note.measureNumber * 1000000 + note.startTime;
this->noteList.insert(make_pair(key, note));
}
我想看看这些值是否确实插入到多重映射中,因此我放置了一个断点,这就是多重映射的样子(在 Xcode 中):
似乎我可以无限地打开元素(我的实际多重映射是名为 noteList
的第一个元素)如果这是正常的以及为什么我无法读取实际的对值(长和注释)?
最佳答案
libstdc++ 使用通用的红/黑树实现其映射和集合。树的节点使用基类 _Rb_tree_node_base
其中包含指向父/左/右节点的相同类型的指针。
为了访问数据,它会对您提供的模板参数特定的节点类型执行静态转换。除非您可以强制转换,否则您将无法使用 XCode 查看数据。
它的作用与链表类似,具有链表节点基础。
编辑:这样做是为了删除模板生成的重复代码量。而不是有一个RbTree<Type1>
, RbTree<Type2>
, 等等; libstdc++ 有一组适用于基类的操作,并且无论映射的基础类型如何,这些操作都是相同的。它仅在需要检查数据时进行转换,并且所有树的实际旋转/重新平衡代码都是相同的。
关于c++ - 内存中的多重映射表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845604/