std::scoped_allocator_adaptor
定義於標頭檔案 <scoped_allocator> |
||
template< class OuterAlloc, class... InnerAllocs > class scoped_allocator_adaptor |
(C++11 起) | |
std::scoped_allocator_adaptor
類模板是一個分配器,可用於多級容器(`vector` 的 `set` 的 `list` 的 `tuple` 的 `map` 等)。它例項化一個外部分配器型別 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 |
[編輯] 示例
#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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2108 | C++11 | 沒有辦法表明 scoped_allocator_adaptor 是否是無狀態的 |
提供了 is_always_equal |
[編輯] 另見
(C++11) |
提供關於分配器型別的資訊 (類模板) |
(C++11) |
檢查指定型別是否支援 uses-allocator 構造 (類模板) |
預設分配器 (類模板) |