Подход не так сложен.По сути, контейнер получит память от распределителя и затем выполнит копирование (с Placement-New поверх этой памяти).Более простой контейнер для просмотра - vector
:
void push_back( T const & value ) {
ensure_enough_capacity();
new (end_ptr++) T( value );
}
Где ensure_enough_capacity()
определяет, должен ли вектор расти и делает ли это, то есть он будет вызывать распределитель, если size()==capacity()
when *Называется 1009 *.
Следующий уровень сложности - list
, где каждый узел выделен сам по себе, и есть некоторая дополнительная информация, которой должна управлять библиотека.В этом случае код будет выглядеть следующим образом:
void push_back( T const& value ) {
node* n = allocator::allocate( sizeof(node) );
new (n) node( value, x, y );
}
Где x
и y
- соответствующие указатели для инициализации указателей next
и last
узла (обычно это указатель напоследний узел для last
и указатель на сторожевой узел - недопустимый за концом (для next
), и предполагается, что этот конкретный конструктор будет копировать-конструировать value
, а затемисправить все упомянутые указатели.
Упорядоченные ассоциативные контейнеры имеют дополнительный уровень сложности управления сбалансированным деревом, но подход тот же: выделите блок, достаточно большой, чтобы содержать значение и дополнительную информацию, а затем использоватьplace-new для построения узла .Остальные детали структуры данных.