Похоже, что функция распределителей с сохранением состояния в контейнерах STL уже широко поддерживается.В большинстве случаев состояние распределителя не вызывает проблем.То, что пока широко не поддерживается, - это новый способ обработки проблемных ситуаций новым стандартом (перестановка контейнера (нужно ли также перераспределять распределитель), объединение списков).
Этот поток говорит:
в коде для большинства современных стандартных библиотек (включая Dinkumware, используемые MS), поддерживаются распределители с сохранением состояния
Этот шаг (libstdc ++,2004) говорит (если я правильно понял):
Мы уже поддерживаем распределители, где l1.get_allocator() != l2.get_allocator()
.Мы не делаем никаких специальных положений для обнаружения этих распределителей в splice()
и swap()
.
Эта запись в блоге (libstdc ++, 2009) гласит:
Существующие контейнеры в режиме C ++ 0x теперь более эффективны вместе с распределителями с сохранением состояния (т. Е. Во время создания элемента распределители не создаются на лету).
В этом документе говорится о новой библиотеке libc ++ :
Все контейнеры соответствуют всем последним требованиям к распределителям, которые полностью поддерживают распределители с сохранением состояния.- Оптимизировано пространство для распределителей без сохранения состояния.
EASTL поддерживает распределители состояния.
Этот поток содержит интересный спор о том, насколько это переносимоособенность.
Таким образом, большинство реализаций STL поддерживают распределители Statefull, что означает, что они не создают дополнительные экземпляры типа распределителя под капотом, но хранят предоставленный клиентом экземпляр распределителя, и все выделения / освобождения выполняются черезтот.Однако то, как они обрабатывают swap
ping и list::splice
, недокументировано, непереносимо.
ОБНОВЛЕНИЕ: STL VS2008 требует, чтобы распределители имели конструктор шаблонного копирования, что в IMO наиболее важно использовать пользовательскийраспределители невозможны: простое сегрегированное хранилище.
Для тех, кто не удовлетворен текущим состоянием распределителей с сохранением состояния в STL, я рекомендую рассмотреть Boost.Intrusive
и Boost.Container
.