К сожалению, распределители STL не могут иметь состояния (или, по крайней мере, должны быть очень осторожны при использовании этого состояния) - каждый экземпляр определенного типа распределителя должен быть эквивалентен для контейнеров STL для эффективной работы с ними. Я не помню подробностей прямо сейчас, но я знаю, что Скотт Мейерс подробно обсуждает эту проблему в «Эффективный STL» , пункт 10: знать о соглашениях и ограничениях распределителя.
Тем не менее, вы можете иметь шаблонные распределители, которые очень похожи с различиями между распределителями, инкапсулированными в типе распределителя, и использовать разные «экземпляры» шаблона распределителя (каждый экземпляр «экземпляра» является другой тип). Опять же, я помню, что Мейерс обсуждает это довольно четко.
Например, см. Этот абзац из статьи Энтони Ауэ, «Повышение производительности с помощью пользовательских распределителей пула для STL» :
Потенциально более серьезное предостережение заключается в том, что, поскольку распределитель использует нестатические данные, он технически не соответствует Стандарту, поскольку Стандарт требует, чтобы распределители одного типа были эквивалентными. См. Эффективный STL (пункт 10) для подробного объяснения проблемы. Это сводится к требованию, чтобы распределитель для данного типа мог освобождать память, выделенную любым другим экземпляром распределителя для этого типа. Для многих применений стандартных контейнеров это требование не является необходимым (некоторые могут сказать, Draconian). Однако есть два случая, когда это требование абсолютно необходимо: list :: splice и swap (). Случай swap () особенно серьезен, поскольку он необходим для реализации определенных операций над контейнерами безопасным для исключений образом (см. «Исключительный C ++», пункт 12). Технически, подкачка может быть (и в некоторых случаях) реализована перед лицом распределителей, которые не сравниваются одинаково - элементы могут быть скопированы или распределители могут быть обменены вместе с данными - но это не всегда так. По этой причине, если вы используете swap () или list :: splice, вы должны обязательно использовать HoldingPolicySingleton; в противном случае вы столкнетесь с каким-то по-настоящему неприятным поведением.
См. Также обсуждение Стефана Т. Лававея в этой ветке новостной группы .
Я обновлю позже вечером, если кто-то еще не сообщит подробности.