std::scoped_allocator_adaptor
Определён в заголовочном файле <scoped_allocator> | ||
|---|---|---|
template< class OuterAlloc, class... InnerAllocs >
class scoped_allocator_adaptor
: public OuterAlloc;
| (начиная с C++11) |
Шаблон класса std::scoped_allocator_adaptor — это аллокатор, который можно использовать с многоуровневыми контейнерами (вектор множеств списков кортежей отображений и т. д.). Он создаётся с одним внешним типом аллокатора OuterAlloc и нулём или более внутренними типами аллокаторов InnerAlloc.... Контейнер, непосредственно созданный с помощью scoped_allocator_adaptor, использует OuterAlloc для выделения памяти под свои элементы, но если элемент сам является контейнером, он использует первый внутренний аллокатор. Элементы этого контейнера, если они сами являются контейнерами, используют второй внутренний аллокатор и т. д. Если уровней вложенности контейнера больше, чем внутренних аллокаторов, последний внутренний аллокатор повторно используется для всех последующих вложенных контейнеров.
Назначение этого адаптера — правильно инициализировать аллокаторы с состоянием во вложенных контейнерах, например, когда все уровни вложенного контейнера должны находиться в одном сегменте разделяемой памяти. Конструктор адаптера принимает аргументы для всех аллокаторов в списке, а каждый вложенный контейнер при необходимости получает состояние своего аллокатора от адаптера.
Для целей scoped_allocator_adaptor, если следующий внутренний аллокатор — A, любой класс T, для которого std::uses_allocator<T,A>::value == true, участвует в рекурсии так, как если бы он был контейнером. Кроме того, std::pair рассматривается как такой контейнер специальными перегрузками scoped_allocator_adaptor::construct.
Типичная реализация содержит экземпляр std::scoped_allocator_adaptor<InnerAllocs...> в качестве объекта-члена.
Обратите внимание, что std::pmr::polymorphic_allocator распространяются на вложенные контейнеры согласно конструированию с использованием аллокатора и не требуют std::scoped_allocator_adaptor (и несовместимы с ним).
Вложенные типы
| Тип | Определение |
|---|---|
outer_allocator_type |
OuterAlloc |
inner_allocator_type |
|
value_type | std::allocator_traits<OuterAlloc>::value_type |
size_type | std::allocator_traits<OuterAlloc>::size_type |
difference_type | std::allocator_traits<OuterAlloc>::difference_type |
pointer | std::allocator_traits<OuterAlloc>::pointer |
const_pointer | std::allocator_traits<OuterAlloc>::const_pointer |
void_pointer | std::allocator_traits<OuterAlloc>::void_pointer |
const_void_pointer | std::allocator_traits<OuterAlloc>::const_void_pointer |
Пусть заданы OuterAlloc и InnerAlloc... как Allocs:
| Тип | Определение |
|---|---|
propagate_on_container_copy_assignment |
|
propagate_on_container_move_assignment |
|
propagate_on_container_swap |
|
is_always_equal |
|
Функции-члены
создаёт новый объект scoped_allocator_adaptor (открытая функция-член) |
|
уничтожает объект scoped_allocator_adaptor (открытая функция-член) |
|
присваивает значение scoped_allocator_adaptor (открытая функция-член) |
|
получает ссылку на внутренний аллокатор inner_allocator (открытая функция-член) |
|
получает ссылку на внешний аллокатор outer_allocator (открытая функция-член) |
|
| выделяет неинициализированную память с помощью внешнего аллокатора (открытая функция-член) |
|
| освобождает память с помощью внешнего аллокатора (открытая функция-член) |
|
| возвращает наибольший размер выделения памяти, поддерживаемый внешним аллокатором (открытая функция-член) |
|
| создаёт объект в выделенной памяти, при необходимости передавая внутренний аллокатор его конструктору (открытая функция-член) |
|
| уничтожает объект в выделенной памяти (открытая функция-член) |
|
копирует состояние scoped_allocator_adaptor и всех его аллокаторов (открытая функция-член) |
|
Шаблоны функций, используемые только для описания |
|
| получает самый внешний аллокатор (функция-член, используемая только для описания*) |
|
| создаёт объект с помощью самого внешнего аллокатора (функция-член, используемая только для описания*) |
|
| уничтожает объект с помощью самого внешнего аллокатора (функция-член, используемая только для описания*) |
|
Функции, не являющиеся членами
|
(удалены в C++20) | сравнивает два объекта scoped_allocator_adaptor (шаблон функции) |
Руководства по выводу типов(начиная с C++17)
Вложенные классы
| Класс | Определение |
|---|---|
rebind |
template< class T > struct rebind { using other = scoped_allocator_adaptor <std::allocator_traits<OuterAlloc>::template rebind_alloc<T>, InnerAllocs...>; }; |
Пример
#include <boost/interprocess/allocators/adaptive_pool.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <scoped_allocator>
#include <vector>
namespace bi = boost::interprocess;
template<class T>
using alloc = bi::adaptive_pool<T, bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main()
{
bi::managed_shared_memory s(bi::create_only, "Demo", 65536);
// create vector of vectors in shared memory
ipc_matrix v(s.get_segment_manager());
// for all these additions, the inner vectors obtain their allocator arguments
// from the outer vector's scoped_allocator_adaptor
v.resize(1);
v[0].push_back(1);
v.emplace_back(2);
std::vector<int> local_row = {1, 2, 3};
v.emplace_back(local_row.begin(), local_row.end());
bi::shared_memory_object::remove("Demo");
}
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2108 | C++11 | не было способа определить, является ли scoped_allocator_adaptor аллокатором без состояния | добавлен is_always_equal |
См. также
|
(C++11) | предоставляет сведения о типах аллокаторов (шаблон класса) |
|
(C++11) | проверяет, поддерживает ли указанный тип конструирование с использованием аллокатора (шаблон класса) |
| аллокатор по умолчанию (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/scoped_allocator_adaptor