Поделиться через


Класс scoped_allocator_adaptor

Представляет вложенные распределители.

Синтаксис

template <class Outer, class... Inner>
class scoped_allocator_adaptor;

Замечания

Шаблон класса инкапсулирует гнездо одного или нескольких распределителей. Каждый из этих классов имеет внешний распределитель типа outer_allocator_type, синоним Outer, который представляет собой общедоступную базу объекта scoped_allocator_adaptor. Outer используется для выделения памяти, которая будет использоваться контейнером. Можно получить ссылку на этот базовый объект распределителя, вызвав метод outer_allocator.

Остальная часть вложения имеет тип inner_allocator_type. Внутренний распределитель используется для выделения памяти для элементов в контейнере. Для получения ссылки на сохраненный объект этого типа вызовите inner_allocator. Если Inner... он не пуст, inner_allocator_type имеет тип scoped_allocator_adaptor<Inner...>и inner_allocator назначает объект-член. В противном случае inner_allocator_type имеет тип scoped_allocator_adaptor<Outer>, а inner_allocator назначает целый объект.

Вложение ведет себя так, как будто имеет произвольную глубину, реплицируя свой самый внутренний инкапсулированный распределитель так, как нужно.

Несколько концепций, которые не являются частью видимого интерфейса в описании поведения этого шаблона класса. Внешний распределитель преобразует все вызовы, адресованные методам construct и destroy. Он эффективно определяется рекурсивной функцией OUTERMOST(X), где OUTERMOST(X) находится одна из следующих.

  • Если X.outer_allocator() имеет правильный формат, OUTERMOST(X) равен OUTERMOST(X.outer_allocator()).

  • В противном случае OUTERMOST(X) является X.

В целях демонстрации определено три типа:

Тип Описание
Outermost Тип параметра OUTERMOST(*this).
Outermost_traits allocator_traits<Outermost>
Outer_traits allocator_traits<Outer>

Конструкторы

Имя Описание
scoped_allocator_adaptor Формирует объект scoped_allocator_adaptor.

Определения типов

Имя Описание
const_pointer Этот тип является синонимом const_pointer, связанного с распределителем Outer.
const_void_pointer Этот тип является синонимом const_void_pointer, связанного с распределителем Outer.
difference_type Этот тип является синонимом difference_type, связанного с распределителем Outer.
inner_allocator_type Этот тип является синонимом типа вложенного адаптера scoped_allocator_adaptor<Inner...>.
outer_allocator_type Этот тип является синонимом типа базового распределителя Outer.
pointer Этот тип является синонимом pointer, связанного с распределителем Outer.
propagate_on_container_copy_assignment Тип содержит значение true только в том случае, если Outer_traits::propagate_on_container_copy_assignment или inner_allocator_type::propagate_on_container_copy_assignment имеет значение true.
propagate_on_container_move_assignment Тип содержит значение true только в том случае, если Outer_traits::propagate_on_container_move_assignment или inner_allocator_type::propagate_on_container_move_assignment имеет значение true.
propagate_on_container_swap Тип содержит значение true только в том случае, если Outer_traits::propagate_on_container_swap или inner_allocator_type::propagate_on_container_swap имеет значение true.
size_type Этот тип является синонимом size_type, связанного с распределителем Outer.
value_type Этот тип является синонимом value_type, связанного с распределителем Outer.
void_pointer Этот тип является синонимом void_pointer, связанного с распределителем Outer.

Структуры

Имя Описание
Структура scoped_allocator_adaptor::rebind Определяет тип Outer::rebind<Other>::other как синоним для scoped_allocator_adaptor<Other, Inner...>.

Методы

Имя Описание
размещать Выделяет память, используя распределитель Outer.
строить Создает объект .
Освобождения Освобождает объекты, используя внешний распределитель.
разрушать Удаляет указанный объект.
inner_allocator Извлекает ссылку на сохраненный объект типа inner_allocator_type.
max_size Определяет максимальное число объектов, которые могут быть распределены внешним распределителем.
outer_allocator Извлекает ссылку на сохраненный объект типа outer_allocator_type.
select_on_container_copy_construction Создает новый объект scoped_allocator_adaptor с каждым сохраненным объектом распределителя, который инициализируется вызовом метода select_on_container_copy_construction для каждого соответствующего распределителя.

Операторы

Оператор Описание
оператор =
оператор ==
оператор!=

Требования

Заголовок:<scoped_allocator>

Пространство имен: std

scoped_allocator_adaptor::allocate

Выделяет память, используя распределитель Outer.

pointer allocate(size_type count);pointer allocate(size_type count, const_void_pointer hint);

Параметры

число
Количество элементов, для которых необходимо выделить достаточный объем памяти.

подсказка
Указатель, который может помочь объекту распределителя, найдя адрес объекта, который был выделен до этого запроса.

Возвращаемое значение

Первая функция-член возвращает значение Outer_traits::allocate(outer_allocator(), count). Вторая функция-член возвращает значение Outer_traits::allocate(outer_allocator(), count, hint).

scoped_allocator_adaptor::construct

Создает объект .

template <class Ty, class... Atypes>
void construct(Ty* ptr, Atypes&&... args);

template <class Ty1, class Ty2, class... Atypes1, class... Atypes2>
void construct(pair<Ty1, Ty2>* ptr, piecewise_construct_t,
    tuple<Atypes1&&...>
first, tuple<Atypes1&&...> second);

template <class Ty1, class Ty2>
void construct(pair<Ty1, Ty2>* ptr);

template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr,
    class Uy1&& first, class Uy2&& second);

template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr, const pair<Uy1, Uy2>& right);

template <class Ty1, class Ty2, class Uy1, class Uy2>
void construct(pair<Ty1, Ty2>* ptr, pair<Uy1, Uy2>&& right);

Параметры

ptr
Указатель на место в памяти, где необходимо создать объект.

args
Список аргументов.

первый
Объект первого типа в паре.

второй
Объект второго типа в паре.

правой
Существующий объект, который необходимо переместить или копировать.

Замечания

Первый метод создает объект в ptr путем вызова Outermost_traits::construct(OUTERMOST(*this), ptr, xargs...), где xargs... находится один из следующих вариантов.

  • Если uses_allocator<Ty, inner_allocator_type> имеет значение false, то xargs... равно args....

  • Если uses_allocator<Ty, inner_allocator_type> имеет значение true и is_constructible<Ty, allocator_arg_t, inner_allocator_type, args...> имеет значение true, то xargs... равно allocator_arg, inner_allocator(), args....

  • Если uses_allocator<Ty, inner_allocator_type> имеет значение true и is_constructible<Ty, args..., inner_allocator()> имеет значение true, то xargs... равно args..., inner_allocator().

Второй метод создает объект пары в ptr путем вызова Outermost_traits::construct(OUTERMOST(*this), &ptr->first, xargs...), где xargs...first... изменяется как в приведенном выше списке, и Outermost_traits::construct(OUTERMOST(*this), &ptr->second, xargs...)где xargs...second... изменяется, как в приведенном выше списке.

Третий метод работает так же, как this->construct(ptr, piecewise_construct, tuple<>, tuple<>).

Четвертый метод работает так же, как this->construct(ptr, piecewise_construct, forward_as_tuple(std::forward<Uy1>(first), forward_as_tuple(std::forward<Uy2>(second)).

Пятый метод работает так же, как this->construct(ptr, piecewise_construct, forward_as_tuple(right.first), forward_as_tuple(right.second)).

Шестой метод работает так же, как this->construct(ptr, piecewise_construct, forward_as_tuple(std::forward<Uy1>(right.first), forward_as_tuple(std::forward<Uy2>(right.second)).

scoped_allocator_adaptor::d eallocate

Освобождает объекты, используя внешний распределитель.

void deallocate(pointer ptr, size_type count);

Параметры

ptr
Указатель на начальное расположение освобождаемых объектов.

число
Количество освобождаемых объектов.

scoped_allocator_adaptor::d e

Удаляет указанный объект.

template <class Ty>
void destroy(Ty* ptr)

Параметры

ptr
Указатель на уничтожаемый объект.

Возвращаемое значение

Outermost_traits::destroy(OUTERMOST(*this), ptr)

scoped_allocator_adaptor::inner_allocator

Извлекает ссылку на сохраненный объект типа inner_allocator_type.

inner_allocator_type& inner_allocator() noexcept;
const inner_allocator_type& inner_allocator() const noexcept;

Возвращаемое значение

Ссылка на сохраненный объект типа inner_allocator_type.

scoped_allocator_adaptor::max_size

Определяет максимальное число объектов, которые могут быть распределены внешним распределителем.

size_type max_size();

Возвращаемое значение

Outer_traits::max_size(outer_allocator())

scoped_allocator_adaptor::operator=

scoped_allocator_adaptor& operator=(const scoped_allocator_adaptor&) = default;
scoped_allocator_adaptor& operator=(scoped_allocator_adaptor&&) = default;

scoped_allocator_adaptor::operator==

template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;

scoped_allocator_adaptor::operator!=

template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;

scoped_allocator_adaptor::outer_allocator

Извлекает ссылку на сохраненный объект типа outer_allocator_type.

outer_allocator_type& outer_allocator() noexcept;
const outer_allocator_type& outer_allocator() const noexcept;

Возвращаемое значение

Ссылка на сохраненный объект типа outer_allocator_type.

Структура scoped_allocator_adaptor::rebind

Определяет тип Outer::rebind<Other>::other как синоним для scoped_allocator_adaptor<Other, Inner...>.

struct rebindd{ typedef Other_traits::rebind<Other> Other_alloc; typedef scoped_allocator_adaptor Other_alloc<, Inner...> other; };

Конструктор scoped_allocator_adaptor::scoped_allocator_adaptor

Формирует объект scoped_allocator_adaptor. Также включает деструктор.

scoped_allocator_adaptor();

scoped_allocator_adaptor(const scoped_allocator_adaptor& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(
const scoped_allocator_adaptor<Outer2, Inner...>& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(
scoped_allocator_adaptor<Outer2, Inner...>&& right) noexcept;
template <class Outer2>
scoped_allocator_adaptor(Outer2&& al,
    const Inner&... rest) noexcept;

~scoped_allocator_adaptor();

Параметры

правой
Существующий scoped_allocator_adaptor.

Аль
Существующий распределитель, который следует использовать как внешний распределитель.

отдых
Список распределителей, которые следует использовать как внутренние распределители.

Замечания

Первый конструктор по умолчанию создает сохраненные объекты распределителя. Каждый из следующих трех конструкторов создает свои сохраненные объекты распределителя из соответствующих объектов справа. Последний конструктор создает сохраненные объекты распределителя из соответствующих аргументов в списке.

scoped_allocator_adaptor::select_on_container_copy_construction

Создает новый объект scoped_allocator_adaptor с каждым сохраненным объектом распределителя, который инициализируется вызовом метода select_on_container_copy_construction для каждого соответствующего распределителя.

scoped_allocator_adaptor select_on_container_copy_construction();

Возвращаемое значение

Этот метод фактически возвращает scoped_allocator_adaptor(Outer_traits::select_on_container_copy_construction(*this), inner_allocator().select_on_container_copy_construction()). Результатом является новый scoped_allocator_adaptor объект с каждым сохраненным объектом распределителя, инициализированным путем вызова al.select_on_container_copy_construction() соответствующего распределителя al.

См. также

Справочник по файлам заголовков