Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Представляет вложенные распределители.
Синтаксис
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.