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 | scoped_allocator_adaptor<InnerAllocs...> или, если sizeof...(InnerAllocs) == 0, scoped_allocator_adaptor<OuterAlloc> |
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 |
propagate_on_container_copy_assignment std::true_type если std::allocator_traits<A>::propagate_on_container_copy_assignment::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc... |
|
propagate_on_container_move_assignment std::true_type если std::allocator_traits<A>::propagate_on_container_move_assignment::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc... |
|
propagate_on_container_swap std::true_type если std::allocator_traits<A>::propagate_on_container_swap::value является true по крайней мере для одного распределителя A среди OuterAlloc и InnerAlloc... |
|
is_always_equal std::true_type если std::allocator_traits<A>::is_always_equal::value является true для каждого распределителя A среди OuterAlloc и InnerAlloc... |
|
rebind
|
|
Члены-функции
| создает новый экземпляр scoped_allocator_adaptor (публичная функция-член) |
|
уничтожает экземпляр scoped_allocator_adaptor (публичная функция-член) |
|
присваивает scoped_allocator_adaptor (публичная функция-член) |
|
получает ссылку на inner_allocator (публичная функция-член) |
|
получает ссылку на outer_allocator (публичная функция-член) |
|
| выделяет неинициализированное хранилище, используя внешний распределитель (публичная функция-член) |
|
| освобождает хранилище, используя внешний распределитель (публичная функция-член) |
|
| возвращает максимальный размер выделения, поддерживаемый внешним распределителем (публичная функция-член) |
|
| создает объект в выделенном хранилище, передавая внутренний распределитель в его конструктор, если это уместно (публичная функция-член) |
|
| уничтожает объект в выделенном хранилище (публичная функция-член) |
|
копирует состояние scoped_allocator_adaptor и всех его распределителей (публичная функция-член) |
Функции вне класса
|
(удалено в C++20) | сравнивает два экземпляра scoped_allocator_adaptor (шаблон функции) |
Руководства по выводу(с C++17)
Пример
#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/w/cpp/memory/scoped_allocator_adaptor