如何在Visual C ++中实现std :: map?
我知道一些树数据结构只是在删除它们时将节点标记为已删除,而不是立即删除它们。我需要确保我的元素永远不会与地图中不再存在的元素进行比较。
编辑:
我知道实施可能是正确的。合同,要求我对元素类型进行完全弱排序。但是,我只有一个部分排序,它无法比较不同时存在的元素。
答案 0 :(得分:4)
回答一般的数据结构实施而不是MSVC或std::map
:
您似乎认为容器需要知道该标志的用户才能忽略已删除的元素。
如果实现只是将元素标记为不再包含,则它将作为实现细节执行。这意味着从容器的任何外部用户的角度来看,该元素根本不会在容器中可见。特别是,容器上的任何查找方法都会注意到该标志并忽略它附加的任何内容。只要实现正确地保留了语义,你真的不需要担心它是否使用了标记技术。
答案 1 :(得分:4)
实现是否维护已擦除的节点,它必须在节点擦除时调用包含的对象析构函数。之后,它不可能将对象传递给比较函数,因为这会导致未定义的行为,这将使其成为不合规的实现。
答案 2 :(得分:3)
我不知道Microsoft STL实现中的任何错误,您必须在此担心。对于类来说,访问比较已经删除的元素将是一个错误,尽管我可以想象清除可能是如何在带外进行的。
如果您确实需要实现详细信息,请查看IDE中正在运行的代码中<map>
和<xtree>
中元素删除背后的源代码。