Deferred Value Destruction for erase
All of the standard collection erase functions actually perform two functions:1. Remove the element from the collection.
2. Destroy the value contained by that element.
In all cases, the destroy is immediate: when erase returns, the value's destructor has been called. However, the design of CompactSet deviates from this convention: the value destruction may be deferred until some point after erase has returned. In fact, if the erased value is part of archiveSet, it must not be destroyed until a compaction occurs.
The reason for this is that the erased value must hold its position in the sorted vector so that future binary searches on the vector are valid. If the value were destroyed prematurely, the binary search might access the destroyed element while searching for another value. The value must remain valid until its destructor is called (some time later, during compaction).
This condition is satisfied for all pure value types (including all primitive types, std::strings, and the standard collections, provided the value type of the collection is a pure value). Any class that destroys all of its state in its destructor will work with deferred destruction.
Classes that do not manage their own resources may not be compatible with CompactSet. In particular, any design that destroys or alters the contents of the value immediately after it has been erased will not work with CompactSet.