В каком разделе стандарта С++ требуется, чтобы set:: erase быстро вызывал деструкторы

Какой раздел стандарта С++ 11 (здесь копия черновика стандарта) требует ассоциативных контейнеров, таких как std:: set, std:: map, std:: unordered_set и std:: unordered_map, чтобы немедленно вызвать деструкторы объектов, которые удалены из них?

Другими словами, стандартизованные ассоциативные контейнеры позволяют задерживать (не elide!) свои вызовы деструкторам ключей и/или значений ключей и значений, которые они хранят?

Если нет, какой раздел в стандарте запрещает?

Я спрашиваю, потому что меня интересуют ленивые удаления (иногда называемые слабые удаления) в ассоциативных контейнерах. Это метод "стирания" ключа (или пары ключ/значение) из структуры, в которой фактические данные остаются на месте, но содержащая его node помечена как мертвая. Их иногда называют надгробными камнями. Они используются во многих документах теории структуры данных, а иногда используются на практике.

Очень простой пример - удаление в хэш-таблицах с открытым обращением, которое иногда реализуется с надгробиями. Когда хеш-таблица в конечном итоге восстанавливается, вызывается все деструкторы, а пары с ключом/значением могут быть фактически удалены и деблокированы.

Ответы

Ответ 1

В таблице для ассоциативных контейнеров содержатся общие требования, которые описывают требования для вызовов erase.

например. a.erase(q) | стирает элемент, на который указывает q.

Тип элемента для map - это пара ключей и значение. Не существует разумной интерпретации "стираний", которая не предполагает надлежащего разрушения элемента (ключа и значения). Я сомневаюсь, что в этой ситуации в явном виде есть что-то более четко сформулированное.