An AllocatorAwareContainer is a Container that holds an instance of an Allocator and uses that instance in all its member functions to allocate and deallocate memory and to construct and destroy objects in that memory (such objects may be container elements, nodes, or, for unordered containers, bucket arrays).
The following rules apply to container construction.
std::allocator_traits<allocator_type>::select_on_container_copy_construction on the allocator of the container being copied. The only way to replace an allocator is copy-assignment, move-assignment, and swap:
std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value is true std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value is true std::allocator_traits<allocator_type>::propagate_on_container_swap::value is true. Specifically, it will exchange the allocator instances through an unqualified call to the non-member function swap, see Swappable. Note: swapping two containers with unequal allocators if propagate_on_container_swap is false is undefined behavior.
get_allocator() obtains a copy of the allocator that was used to construct the container or installed by the most recent allocator replacement operation. Legend |
|
X | Container type |
T | Element type |
A | Allocator for T |
a, b | Objects of type X (non-const lvalue) |
t | Object of type X (lvalue or const rvalue) |
rv | Object of type X (non-const rvalue) |
m | Object of type A |
Q | Allocator type |
| expression | return type | pre/requirements | post/effects | complexity |
|---|---|---|---|---|
allocator_type | A |
allocator_type::value_type must be the same as X::value_type | compile-time | |
get_allocator() | A | constant | ||
X u; |
A is DefaultConstructible
| u.empty() == true && u.get_allocator() == A() | constant | |
X u(m); | u.empty() == true && u.get_allocator() == m | constant | ||
X u(t,m); | T is CopyInsertable into X |
u == t && u.get_allocator() == m | linear | |
X u(rv); | Move constructor of A must not throw exceptions | u has the same elements and an equal allocator as rv had before the construction | constant | |
X u(rv,m); |
T is MoveInsertable into X | The elements of u are the same or copies of those of rv and u.get_allocator() == m | constant if m == rv.get_allocator(), otherwise linear |
|
a = t |
X& |
T is CopyInsertable into X and CopyAssignable |
a == t | linear |
a = rv |
X& | If the allocator will not be replaced by move-assignment (see above), then T is MoveInsertable into X and MoveAssignable | All existing elements of a are either move assigned to or destroyed; a is equal to the value that rv had before the assignment | linear |
a.swap(b) | void | Exchanges the contents of a and b | constant |
Allocator-aware containers always call std::allocator_traits<A>::construct(m, p, args) to construct an object of type A at p using args, with m == get_allocator(). The default construct in std::allocator calls ::new((void*)p) T(args), but specialized allocators may choose a different definition.
All standard library containers except std::array are AllocatorAwareContainers:
std::basic_string std::deque std::forward_list std::list std::vector std::map std::multimap std::set std::multiset std::unordered_map std::unordered_multimap std::unordered_set std::unordered_multiset
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/named_req/AllocatorAwareContainer