Почему распределитель std :: list параметризован value_type по умолчанию? - PullRequest
1 голос
/ 02 марта 2020
template <
  class T,
  class Allocator = std::allocator<T>
>
class list;

Объявляя переменную std::list<int>, как показано ниже, я бы гарантировал, что тип std::list<int>::allocator_type равен std::allocator<int>. Предполагая реализацию двусвязного списка, каждый внутренний узел будет больше, чем размер value_type. Означает ли это, что реализация будет выделять память дважды при каждой вставке элемента? Один раз для элемента и один раз для узла? Предварительная декларация std::list показана выше для справки.

int main(int argc, char *argv[])
{
  std::list<int> mylist;
  mylist.push_front(9);
  return 0;
}

1 Ответ

1 голос
/ 03 марта 2020

См. cppreference , std::list<T> выделяет свои внутренние узлы (скажем, класс Node<T>), используя std::allocator_traits<Allocator>::rebind_alloc<Node<T>>, что по умолчанию Alloc<Node<T>, Args>, если Allocator равно Alloc<T, Args>. Таким образом, когда используется std::allocator, std::list<T> будет использовать std::allocator<Node<T>> для выделения своих внутренних узлов.

Если вы хотите предоставить пользовательский шаблон распределителя Alloc и не хотите, чтобы std::list<T> используйте Alloc<Node<T>>, вы можете предоставить шаблон элемента rebind для Alloc, затем будет использоваться распределитель Alloc::rebind<Node<T>>::other .

...