C ++标准的哪一部分要求set :: erase立即调用析构函数

时间:2014-01-22 06:56:27

标签: c++ c++11 data-structures language-lawyer c++-standard-library

C ++ 11标准的哪一部分(here's a copy of a draft standard)需要关联容器,如std :: set,std :: map,std :: unordered_set和std :: unordered_map,以立即调用对象的析构函数从他们身上消失了?

换句话说 - 符合标准的关联容器是否允许延迟(而不是删除!)对密钥的调用和/或它们存储的密钥和值的析构函数?

如果没有,标准中的哪一部分禁止它?

我问,因为我对关联容器中的延迟删除(有时称为弱删除)感兴趣。这是一种从实际数据保留在原位的结构中“擦除”一个键(或键/值对)的方法,但包含它的节点被标记为死。这些有时被称为墓碑。它们被用在许多关于数据结构的理论论文中,sometimes used in practice

一个非常简单的例子是在开放寻址的哈希表中删除,有时用逻辑删除来实现。最终重建哈希表时,将调用所有析构函数,并且可以实际最终删除和解除分配逻辑删除的键/值对。

1 个答案:

答案 0 :(得分:1)

表中有关于描述erase调用要求的关联容器的一般要求。

E.g。 a.erase(q) |擦除q指向的元素。

map的元素类型是一对键和值。对“擦除”没有合理的解释,不涉及元素的正确破坏(关键和价值)。我怀疑标准中对这种情况有更明确的措辞。