C++ concepts: Allocator
Encapsulates a memory allocation and deallocation strategy.
Every standard library component that may need to allocate or release storage, from std::string, std::vector, and every container except std::array, to std::shared_ptr and std::function, does so through an Allocator: an object of a class type that satisfies the following requirements.
Some requirements are optional: the template std::allocator_traits supplies the default implementations for all optional requirements, and all standard library containers and other allocator-aware classes access the allocator through std::allocator_traits, not directly.
[edit] Requirements
Given
-  A, an Allocator type for typeT
-  a, an object of typeA
-  B, the corresponding Allocator type for typeU(as obtained by rebindingA)
-  ptr, a value of typeallocator_traits<A>::pointer, obtained by calling allocator_traits<A>::allocate()
-  cptr, a value of typeallocator_traits<A>::const_pointer, obtained by conversion fromptr
-  vptr, a value of typeallocator_traits<A>::void_pointer, obtained by conversion fromptr
-  cvptr, a value of typeallocator_traits<A>::const_void_pointer, obtained by conversion fromcptror fromvptr
-  xptr, a dereferencable pointer to some typeX
| Expression | Requirements | Return type | 
|---|---|---|
| A::pointer (optional) | Satisfies NullablePointerandRandomAccessIterator | |
| A::const_pointer (optional) | A::pointeris convertible toA::const_pointer. SatisfiesNullablePointerandRandomAccessIterator | |
| A::void_pointer (optional) | A::pointeris convertible toA::void_pointer
 | |
| A::const_void_pointer (optional) | A::pointer,A::const_pointer, andA::void_pointerare convertible toA::const_void_pointer
 | |
| A::value_type | the type T | |
| A::size_type (optional) | A::size_typecan represent the size of the largest objectAcan allocate | unsigned integer type | 
| A::difference_type (optional) | A::difference_typecan represent the difference of any two pointers to the objects allocated byA | signed integer type | 
| A::template rebind<U>::other (optional[1]) | for any U,B::template rebind<T>::otherisA | the type B | 
| *ptr | T& | |
| *cptr | *cptr and *ptr identify the same object | const T& | 
| ptr->m | same as (*ptr).m, if (*ptr).m is well-defined | the type of T::m | 
| cptr->m | same as (*cptr).m, if (*cptr).m is well-defined | the type of T::m | 
| static_cast<A::pointer>(vptr) | static_cast<A::pointer>(vptr) == ptr | A::pointer | 
| static_cast<A::const_pointer>(cvptr) | static_cast<A::const_pointer>(vptr) == cptr | A::const_pointer | 
| a.allocate(n) | allocates storage suitable for nobjects of typeT, but does not construct them. May throw exceptions. | A::pointer | 
| a.allocate(n, cvptr) (optional) | same as a.allocate(n), but may usecvptr(a pointer obtained froma.allocate()ornullptr_t) in unspecified manner to aid locality | A::pointer | 
| a.deallocate(ptr, n) | deallocates storage previously allocated by a call to a.allocate(n). Does not call destructors, if any objects were constructed, they must be destroyed before calling a.deallocate(). Does not throw exceptions. | (not used) | 
| a.max_size() (optional) | the largest value that can be passed to A::allocate() | A::size_type | 
| a1 == a2 | returns true only if the storage allocated by the allocator a1can be deallocated througha2. Establishes reflexive, symmetric, and transitive relationship. Does not throw exceptions. | bool | 
| a1 != a2 | same as !(a1==a2) | bool | 
| A a1(a) A a1 = a | Copy-constructs a1such that a1 == a. Does not throw exceptions. (Note: everyAllocatoralso satisfiesCopyConstructible) | |
| A a(b) | Constructs asuch that B(a)==b and A(b)==a. Does not throw exceptions. (Note: this implies that all allocators related by rebind maintain each other's resources, such as memory pools) | |
| A a1(std::move(a)) A a1 = std::move(a) | Constructs a1such that it equals the prior value ofa. Does not throw exceptions. | |
| A a(std::move(b)) | Constructs asuch that it equals the prior value ofA(b). Does not throw exceptions. | |
| a.construct(xptr, args) (optional) | Constructs an object of type Xin previously-allocated storage at the address pointed to byxptr, using args as the constructor arguments | |
| a.destroy(xptr) (optional) | Destructs an object of type Xpointed to byxptr, but does not deallocate any storage. | |
| a.select_on_container_copy_construction() (optional) | Provides an instance of Ato be used by the container that is copy-constructed from the one that usesacurrently. Usually returns either a copy ofaor a default-constructedA(). | A | 
| a.propagate_on_container_copy_assignment (optional) | true if the allocator of type Aneeds to be copied when the container that uses it is copy-assigned. Note that if the allocators of the source and the target containers do not compare equal, copy assignment has to deallocate the target's memory using the old allocator and then allocate it using the new allocator before copying the elements (and the allocator). | std::true_type or std::false_type or derived from such | 
| a.propagate_on_container_move_assignment (optional) | true if the allocator of type Aneeds to be copied when the container that uses it is move-assigned. If this member is false and the allocators of the source and the target containers do not compare equal, move assignment cannot take ownership of the source memory and must move-assign or move-construct the elements individually, resizing its own memory as needed. | std::true_type or std::false_type or derived from such | 
| a.propagate_on_container_swap (optional) | true if the allocators of type Aneed to be swapped when two containers that use them are swapped. If this member is false and the allocators of the two containers do not compare equal, the behavior of container swap is undefined. | std::true_type or std::false_type or derived from such | 
Notes:
[1] rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args>, where Args is zero or more additional template parameters.
| Given 
 Then, x1 and x2 are equivalently-valued pointer values, if and only if both  Given 
 Then for the expression w1 == w2 and w1 != w2 either or both objects may be replaced by an equivalently-valued object of type  Given 
 Then, for the expressions p1 == p2, p1 != p2, p1 < p2 p1 <= p2, p1 >= p2, p1 > p2, p1 - p2} either or both objects may be replaced by an equivalently-valued object of type  The above requirements make it possible to compare  | (since C++14) | 
[edit] Examples
a minimum C++11 allocator
template <class Tp> struct SimpleAllocator { typedef Tp value_type; SimpleAllocator(/*ctor args*/); template <class T> SimpleAllocator(const SimpleAllocator<T>& other); Tp* allocate(std::size_t n); void deallocate(Tp* p, std::size_t n); }; template <class T, class U> bool operator==(const SimpleAllocator<T>&, const SimpleAllocator<U>&); template <class T, class U> bool operator!=(const SimpleAllocator<T>&, const SimpleAllocator<U>&);