Как forward_list, set, list и т.д. вызывают std::allocator?

Я заметил, что аллокатор может выделять только объекты типа T и резервировать блоки памяти размером n * sizeof(T). Однако узлы связанного списка внутри типа std::list<T> не обязательно являются объектами типа T и не обязательно имеют тот же размер, что и объекты T. В таком случае, как std::list может использовать std::allocator для выделения памяти?


person cqwrteur    schedule 06.01.2014    source источник
comment
Используя std::allocator<T>::rebind и установив n на 1. :D   -  person yzt    schedule 06.01.2014


Ответы (1)


Вот почему существует тип повторной привязки. Это позволяет вам создать аналогичный распределитель, который вместо этого выделяет что-то другое (например, node<T>).

В основном так:

std::allocator<int> int_alloc;
std::allocator<int>::rebind<node<int>> node_alloc;
//Perhaps more useful:
decltype(int_alloc)::rebind<node<int>> node_alloc;

Конечно, в реальной ситуации все это было бы шаблонно, но, надеюсь, это показывает идею.

Для получения дополнительной информации прочтите примечания и примеры здесь.

person Corbin    schedule 06.01.2014