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

jba*_*ple 15 c++ c++-standard-library language-lawyer data-structures c++11

C++ 11标准的哪一部分(这里是草案标准的副本)需要关联容器,如std :: set,std :: map,std :: unordered_set和std :: unordered_map,以立即调用对象的析构函数从他们身上抹去?

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

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

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

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

CB *_*ley 1

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

例如a.erase(q)| 删除 指向的元素q

的元素类型map是一对键和值。对于“擦除”,没有任何明智的解释不涉及元素(键和值)的正确销毁。我怀疑标准中是否有针对这种情况的更明确的措辞。

  • 我不同意,从容器上的任何迭代中消失的元素肯定满足“擦除”它的解释;此外,“clear”、“pop_back”和“pop_front”都明确声明为“破坏”元素,那么为什么要使用不同的动词“erase”呢? (5认同)