【发布时间】:2011-04-14 02:14:32
【问题描述】:
std::map 在 Visual C++ 中是如何实现的?
我知道一些树数据结构只是在删除节点时将它们标记为已删除,而不是立即删除它们。我需要确保我的元素永远不会与地图中不再存在的元素进行比较。
编辑:
我知道实现可能是正确的。合同,这要求我对元素类型进行完全弱排序。但是,我只有部分排序,无法比较不同时存在的元素。
【问题讨论】:
标签: c++ visual-c++ stl map tree
std::map 在 Visual C++ 中是如何实现的?
我知道一些树数据结构只是在删除节点时将它们标记为已删除,而不是立即删除它们。我需要确保我的元素永远不会与地图中不再存在的元素进行比较。
编辑:
我知道实现可能是正确的。合同,这要求我对元素类型进行完全弱排序。但是,我只有部分排序,无法比较不同时存在的元素。
【问题讨论】:
标签: c++ visual-c++ stl map tree
无论实现是否维护已经被擦除的节点,它必须在节点被擦除时调用包含的对象析构函数。之后,它不可能将对象传递给比较函数,因为这会导致未定义的行为,这将使其成为不合格的实现。
【讨论】:
我不知道您在此处需要担心的 Microsoft STL 实现中的任何错误。类访问以进行比较已删除的元素将是一个错误,尽管我可以想象如何在带外进行清理。
如果您确实需要实现细节,请查看您在 IDE 中运行的代码中的 <map> 和 <xtree> 中元素删除背后的源代码。
【讨论】:
回答一般的数据结构实现而不是 MSVC 或std::map:
您似乎认为容器的用户需要知道该标志才能忽略已删除的元素。
如果实现只是简单地将一个元素标记为不再包含,它将作为一个实现细节进行。这意味着从容器的任何外部用户的角度来看,该元素在容器中根本不可见。特别是,容器上的任何查找方法都会注意到该标志并忽略它所附加的任何内容。只要实现正确地保留了语义,您就不必担心它是否使用了标记技术。
【讨论】: