Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/named req/AllocatorAwareContainer"

From cppreference.com
< cpp‎ | named req
(typo)
(+more content)
Line 2: Line 2:
 
{{cpp/concept/navbar}}
 
{{cpp/concept/navbar}}
  
A {{ttb|AllocatorAwareContainer}} is a {{concept|Container}} that has some extra requirements derived from its use of an allocator object.
+
An {{concept|AllocatorAwareContainer}} is a {{concept|Container}} that stores and uses an instance of an {{concept|Allocator}} to allocate and deallocate memory as needed.
 +
 
 +
The following rules apply to object construction
 +
 
 +
* Copy constructors of {{concept|AllocatorAwareContainer}}s obtain their instances of the allocator by calling {{c|std::allocator_traits<allocator_type>::select_on_container_copy_construction}}.
 +
* Move constructors obtain their instances of allocators by move-constructing from the allocator belonging to the old container.
 +
* All other constructors take an allocator parameter.
 +
 
 +
The only way to replace an allocator is copy-assignment, move-assignment, and swap:
 +
 
 +
* Copy-assignment will replace the allocator only if {{c|std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value}} is {{c|true}}
 +
* Move-assignment will replace the allocator only if {{c|std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value}} is {{c|true}}
 +
* Swap will replace the allocator only if {{c|std::allocator_traits<allocator_type>::propagate_on_container_swap::value}} is {{c|true}}. Specifically, it will exchange the allocator instances through an unqualified call to the non-member function swap, see {{concept|Swappable}}.
 +
 
 +
Note: swapping two containers with unequal allocators if {{tt|propagate_on_container_swap}} is {{c|false}} is undefined behavior.
 +
 
 +
* The accessor {{tt|get_allocator()}} obtains a copy of the allocator that was used to construct the container or installed by the most recent allocator replacement operation.
  
 
===Requirements===
 
===Requirements===
Line 53: Line 69:
 
;X
 
;X
 
* {{concept|CopyAssignable}}
 
* {{concept|CopyAssignable}}
 +
 +
===Standard library===
 +
All standard library containers except {{c|std::array}} are {{concept|AllocatorAwareContainers}}:
 +
* {{c|std::basic_string}}
 +
* {{c|std::deque}}
 +
* {{c|std::forward_list}}
 +
* {{c|std::list}}
 +
* {{c|std::vector}}
 +
* {{c|std::map}}
 +
* {{c|std::multimap}}
 +
* {{c|std::set}}
 +
* {{c|std::multiset}}
 +
* {{c|std::unordered_map}}
 +
* {{c|std::unordered_multimap}}
 +
* {{c|std::unordered_set}}
 +
* {{c|std::unordered_multiset}}

Revision as of 15:05, 3 December 2012

Template:cpp/concept/title Template:cpp/concept/navbar

An Template:concept is a Template:concept that stores and uses an instance of an Template:concept to allocate and deallocate memory as needed.

The following rules apply to object construction

  • Copy constructors of Template:concepts obtain their instances of the allocator by calling std::allocator_traits<allocator_type>::select_on_container_copy_construction.
  • Move constructors obtain their instances of allocators by move-constructing from the allocator belonging to the old container.
  • All other constructors take an allocator parameter.

The only way to replace an allocator is copy-assignment, move-assignment, and swap:

  • Copy-assignment will replace the allocator only if std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::value is true
  • Move-assignment will replace the allocator only if std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value is true
  • Swap will replace the allocator only if 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 Template:concept.

Note: swapping two containers with unequal allocators if propagate_on_container_swap is false is undefined behavior.

  • The accessor get_allocator() obtains a copy of the allocator that was used to construct the container or installed by the most recent allocator replacement operation.

Contents

Requirements

Legend

X Container type
T Element type
A Allocator for T
a, b Objects of type X (non-const lvalue)
t Object of type T (lvalue or const rvalue)
rv Object of type T (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 constant
get_allocator() A constant
X u; u.empty() == true && u.get_allocator() == A() constant
X u(m); u.empty() == true && u.get_allocator() == m constant
X u(t,m); 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); 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& a == t linear
a = rv X& All existing elements of a are either move assigned to or destroyed linear
a.swap(b) void Exchanges the contents of a and b constant

Concept requirements

A
T
X

Standard library

All standard library containers except std::array are Template:concept: