В каком разделе стандарта С++ требуется, чтобы set:: erase быстро вызывал деструкторы
Какой раздел стандарта С++ 11 (здесь копия черновика стандарта) требует ассоциативных контейнеров, таких как std:: set, std:: map, std:: unordered_set и std:: unordered_map, чтобы немедленно вызвать деструкторы объектов, которые удалены из них?
Другими словами, стандартизованные ассоциативные контейнеры позволяют задерживать (не elide!) свои вызовы деструкторам ключей и/или значений ключей и значений, которые они хранят?
Если нет, какой раздел в стандарте запрещает?
Я спрашиваю, потому что меня интересуют ленивые удаления (иногда называемые слабые удаления) в ассоциативных контейнерах. Это метод "стирания" ключа (или пары ключ/значение) из структуры, в которой фактические данные остаются на месте, но содержащая его node помечена как мертвая. Их иногда называют надгробными камнями. Они используются во многих документах теории структуры данных, а иногда используются на практике.
Очень простой пример - удаление в хэш-таблицах с открытым обращением, которое иногда реализуется с надгробиями. Когда хеш-таблица в конечном итоге восстанавливается, вызывается все деструкторы, а пары с ключом/значением могут быть фактически удалены и деблокированы.
Ответы
Ответ 1
В таблице для ассоциативных контейнеров содержатся общие требования, которые описывают требования для вызовов erase
.
например. a.erase(q)
| стирает элемент, на который указывает q
.
Тип элемента для map
- это пара ключей и значение. Не существует разумной интерпретации "стираний", которая не предполагает надлежащего разрушения элемента (ключа и значения). Я сомневаюсь, что в этой ситуации в явном виде есть что-то более четко сформулированное.