diff --git a/docs/containers/maps/reference-flat-map.md b/docs/containers/maps/reference-flat-map.md new file mode 100644 index 00000000..830345ba --- /dev/null +++ b/docs/containers/maps/reference-flat-map.md @@ -0,0 +1,433 @@ +--- +title: "reference_flat_map" +--- + +{{< callout type="info">}} + Header: `reference_flat_map.h` + Similar to: `std::reference_flat_map` +{{< /callout >}} + +A fixed capacity reference map based on a sorted vector. +The container stores references to objects, rather than the objects themselves. +The container is an associative lookup table with O(N) insertion and erase, and O(log N) search. +This container is best used for tables that are occasionally updated and spend most of their time being searched. +Uses `etl::less` as the default key comparison method. + +```cpp +etl::reference_flat_map +``` + +Inherits from `etl::ireference_flat_map`. +`etl::ireference_flat_map` may be used as a size independent pointer or reference type for any `etl::reference_flat_map` instance. + +## Template deduction guides +C++17 and above + +```cpp +template +etl::reference_flat_map(TPairs...) +``` + +### Example + +```cpp +etl::reference_flat_map data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} }; +``` +Defines data as an reference_flat_map of int, of length 4, containing the supplied data. + +## Make template +C++11 and above + +```cpp +template , + typename... TPairs> +constexpr auto make_reference_flat_map(TValues&&... values) +``` + +### Example +auto data = etl::make_reference_flat_map(etl::pair{0, 1}, etl::pair{2, 3}, + etl::pair{4, 5}, etl::pair{6, 7}); + +## Member types + +```cpp +key_type TKey +mapped_type TMapped +value_type pair +size_type size_t +difference_type ptrdiff_t +reference value_type& +const_reference const value_type& +pointer value_type* +const_pointer const value_type* +iterator Random access iterator +const_iterator Constant random access iterator +reverse_iterator ETL_OR_STD::reverse_iterator +const_reverse_iterator ETL_OR_STD::reverse_iterator +``` + +## Constructor + +```cpp +etl::reference_flat_map() +``` +**Description** +Default constructor. + +--- + +```cpp +etl::reference_flat_map(const flat_map& other) +``` +**Description** +Copy constructor. + +--- + +```cpp +template +etl::reference_flat_map(TIterator begin, TIterator end) +``` +**Description** +If the map is full then raises an `etl::reference_flat_map_full`. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +## Element access + +### at +```cpp +TMapped& at(const key_type& key) +const TMapped& at(const key_type& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +template +mapped_type& at(const K& key) +const mapped_type& at(const K& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### find + +```cpp +template +iterator find(const key_type& key) +const_iterator find(const key_type& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +template +iterator find(const K& key) +const_iterator find(const K& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### lower_bound + +```cpp +iterator lower_bound(const key_type& key) +const_iterator lower_bound(const key_type& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is not considered to go before key (i.e., either it is equivalent or goes after). + +--- + +```cpp +template +iterator lower_bound(const K& key) +const_iterator lower_bound(const K& key) const +``` +Returns an iterator pointing to the first element in the container whose key is not considered to go before key (i.e., either it is equivalent or goes after). + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### upper_bound + +```cpp +iterator upper_bound(const key_type& key) +const_iterator upper_bound(const key_type& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is considered to go after `key`. + +--- + +```cpp +template +iterator upper_bound(const K& key) +const_iterator upper_bound(const K& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is considered to go after `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### equal_range + +```cpp +pair equal_range(const key_type& key) +pair equal_range(const key_type& key) const +``` +**Description** +Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +--- + +```cpp +template +pair equal_range(const K& key) +pair equal_range(const K& key) const +``` +**Description** +Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### contains + +```cpp +bool contains(const value_type& key) const +``` +**Description** +Check if the container contains the key. +Since: `20.21.0` + +--- + +```cpp +template +bool contains(const K& k) const +``` +**Description** +Check if the container contains the key. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +## Iterators + +```cpp +iterator begin() +const_iterator begin() const +const_iterator cbegin() const +``` +**Description** +Returns an iterator to the beginning of the map. + +--- + +```cpp +iterator end() +const_iterator end() const +const_iterator cend() const +``` +**Description** +Returns an iterator to the end of the map. + +--- + +```cpp +iterator rbegin() +const_iterator rbegin() const +const_iterator crbegin() const +``` +**Description** +Returns a reverse iterator to the beginning of the map. + +--- + +```cpp +iterator rend() +const_iterator rend() const +const_iterator crend() const +``` +**Description** +Returns a reverse iterator to the end of the map. + +## Capacity + +```cpp +bool empty() const +``` +**Description** +Returns `true` if the size of the map is zero, otherwise `false`. + +--- + +```cpp +bool full() const +``` +**Description** +Returns `true` if the size of the lookup is SIZE, otherwise `false`. + +--- + +```cpp +size_t size() const +``` +**Description** +Returns the size of the lookup. + +--- + +```cpp +size_t max_size() const +``` +**Description** +Returns the maximum possible size of the map. + +--- + +```cpp +size_t available() const +``` +**Description** +Returns the remaining available capacity in the map. + +## Modifiers + +```cpp +reference_flat_map& operator = (const reference_flat_map& rhs) +``` +**Description** +Copies the data from another flat map. + +--- + +```cpp +pair insert(const value_type& value) +``` +**Description** +Inserts `value` into the map. + +--- + +```cpp +iterator insert(iterator position, const value_type& value) +``` +**Description** +Inserts `value` into the map at th esuggested `position`. + +--- + +```cpp +template +void insert(TIterator first, TIterator last) +``` +**Description** +Inserts values in to the map. If the map is full then raises an `etl::flat_map_full`. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +size_t erase(const key_type& key) +``` +**Description** +Erase the element with `key`. + +--- + +```cpp +void erase(iterator i_element) +``` +**Description** +Erase the element at `i_element`. + +--- + +```cpp +void erase(iterator first, iterator last) +``` +**Description** +Erase elements in the range [`first`, `last`). + +--- + +```cpp +template +size_t erase(K&& key) +``` +**Description** +Erases values in the map. +Since: `20.21.0` + +--- + +```cpp +void clear() +``` +**Description** +Clears the lookup to a size of zero. +Iterator are not checked for validity. + +## Non-member functions +Lexicographically comparisons + +```cpp +operator == +``` +**Description** +`true` if the contents of the maps are equal, otherwise `false`. + +--- + +```cpp +operator != +``` +**Description** +`true` if the contents of the maps are not equal, otherwise `false`. + +## Technical stuff + +Reference flat maps are different from the normal version in that the elements are not copied, but linked directly. +This means that the lifetime of the element inserted must be as great as that of the map that contains it. +Unlike most other reference containers, the map has a finite capacity. + +Flat maps are usually implemented internally as a sorted vector of key/value pairs. Whilst this makes searching fast, it can have a detrimental effect when items are inserted into a container that stores complex, non-trivial keys or values. +As inserting requires that all of the items above the insert position must be shifted, this can become an expensive operation for larger containers. + +To improve insertion performance ETL reference flat maps are implemented as vectors of pointers to key/value pairs, sorted by key value. An insertion will involve a copy of a range of pointers; an operation that can be made very fast. + +The downside is that access to an item via an iterator will involve one indirection and the overhead of the container will be one pointer per item. A normal flat map implementation does not have this overhead. + diff --git a/docs/containers/maps/reference-flat-multimap.md b/docs/containers/maps/reference-flat-multimap.md new file mode 100644 index 00000000..f34bbb67 --- /dev/null +++ b/docs/containers/maps/reference-flat-multimap.md @@ -0,0 +1,433 @@ +--- +title: "reference_flat_multimap" +--- + +{{< callout type="info">}} + Header: `reference_flat_multimap.h` + Similar to: `std::reference_flat_multimap` +{{< /callout >}} + +A fixed capacity reference map based on a sorted vector. +The container stores references to objects, rather than the objects themselves. +The container is an associative lookup table with O(N) insertion and erase, and O(log N) search. +This container is best used for tables that are occasionally updated and spend most of their time being searched. +Uses `etl::less` as the default key comparison method. + +```cpp +etl::reference_flat_multimap +``` + +Inherits from `etl::ireference_flat_multimap`. +`etl::ireference_flat_multimap` may be used as a size independent pointer or reference type for any `etl::reference_flat_multimap` instance. + +## Template deduction guides +C++17 and above + +```cpp +template +etl::reference_flat_multimap(TPairs...) +``` + +### Example + +```cpp +etl::reference_flat_multimap data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} }; +``` +Defines data as an reference_flat_multimap of int, of length 4, containing the supplied data. + +## Make template +C++11 and above + +```cpp +template , + typename... TPairs> +constexpr auto make_reference_flat_map(TValues&&... values) +``` + +### Example +auto data = etl::make_reference_flat_map(etl::pair{0, 1}, etl::pair{2, 3}, + etl::pair{4, 5}, etl::pair{6, 7}); + +## Member types + +```cpp +key_type TKey +mapped_type TMapped +value_type pair +size_type size_t +difference_type ptrdiff_t +reference value_type& +const_reference const value_type& +pointer value_type* +const_pointer const value_type* +iterator Random access iterator +const_iterator Constant random access iterator +reverse_iterator ETL_OR_STD::reverse_iterator +const_reverse_iterator ETL_OR_STD::reverse_iterator +``` + +## Constructor + +```cpp +etl::reference_flat_multimap() +``` +**Description** +Default constructor. + +--- + +```cpp +etl::reference_flat_multimap(const flat_map& other) +``` +**Description** +Copy constructor. + +--- + +```cpp +template +etl::reference_flat_multimap(TIterator begin, TIterator end) +``` +**Description** +If the map is full then raises an `etl::reference_flat_map_full`. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +## Element access + +### at +```cpp +TMapped& at(const key_type& key) +const TMapped& at(const key_type& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +template +mapped_type& at(const K& key) +const mapped_type& at(const K& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### find + +```cpp +template +iterator find(const key_type& key) +const_iterator find(const key_type& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +template +iterator find(const K& key) +const_iterator find(const K& key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::flat_map_out_of_range` if the key is not in the table. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### lower_bound + +```cpp +iterator lower_bound(const key_type& key) +const_iterator lower_bound(const key_type& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is not considered to go before key (i.e., either it is equivalent or goes after). + +--- + +```cpp +template +iterator lower_bound(const K& key) +const_iterator lower_bound(const K& key) const +``` +Returns an iterator pointing to the first element in the container whose key is not considered to go before key (i.e., either it is equivalent or goes after). + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### upper_bound + +```cpp +iterator upper_bound(const key_type& key) +const_iterator upper_bound(const key_type& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is considered to go after `key`. + +--- + +```cpp +template +iterator upper_bound(const K& key) +const_iterator upper_bound(const K& key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is considered to go after `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### equal_range + +```cpp +pair equal_range(const key_type& key) +pair equal_range(const key_type& key) const +``` +**Description** +Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +--- + +```cpp +template +pair equal_range(const K& key) +pair equal_range(const K& key) const +``` +**Description** +Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +### contains + +```cpp +bool contains(const value_type& key) const +``` +**Description** +Check if the container contains the key. +Since: `20.21.0` + +--- + +```cpp +template +bool contains(const K& k) const +``` +**Description** +Check if the container contains the key. + +C++11 or above. +For comparators that define `is_transparent`. +Since: `20.21.0` + +## Iterators + +```cpp +iterator begin() +const_iterator begin() const +const_iterator cbegin() const +``` +**Description** +Returns an iterator to the beginning of the map. + +--- + +```cpp +iterator end() +const_iterator end() const +const_iterator cend() const +``` +**Description** +Returns an iterator to the end of the map. + +--- + +```cpp +iterator rbegin() +const_iterator rbegin() const +const_iterator crbegin() const +``` +**Description** +Returns a reverse iterator to the beginning of the map. + +--- + +```cpp +iterator rend() +const_iterator rend() const +const_iterator crend() const +``` +**Description** +Returns a reverse iterator to the end of the map. + +## Capacity + +```cpp +bool empty() const +``` +**Description** +Returns `true` if the size of the map is zero, otherwise `false`. + +--- + +```cpp +bool full() const +``` +**Description** +Returns `true` if the size of the lookup is SIZE, otherwise `false`. + +--- + +```cpp +size_t size() const +``` +**Description** +Returns the size of the lookup. + +--- + +```cpp +size_t max_size() const +``` +**Description** +Returns the maximum possible size of the map. + +--- + +```cpp +size_t available() const +``` +**Description** +Returns the remaining available capacity in the map. + +## Modifiers + +```cpp +reference_flat_multimap& operator = (const reference_flat_multimap& rhs) +``` +**Description** +Copies the data from another flat map. + +--- + +```cpp +pair insert(const value_type& value) +``` +**Description** +Inserts `value` into the map. + +--- + +```cpp +iterator insert(iterator position, const value_type& value) +``` +**Description** +Inserts `value` into the map at th esuggested `position`. + +--- + +```cpp +template +void insert(TIterator first, TIterator last) +``` +**Description** +Inserts values in to the map. If the map is full then raises an `etl::flat_map_full`. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +size_t erase(const key_type& key) +``` +**Description** +Erase the element with `key`. + +--- + +```cpp +void erase(iterator i_element) +``` +**Description** +Erase the element at `i_element`. + +--- + +```cpp +void erase(iterator first, iterator last) +``` +**Description** +Erase elements in the range [`first`, `last`). + +--- + +```cpp +template +size_t erase(K&& key) +``` +**Description** +Erases values in the map. +Since: `20.21.0` + +--- + +```cpp +void clear() +``` +**Description** +Clears the lookup to a size of zero. +Iterator are not checked for validity. + +## Non-member functions +Lexicographically comparisons + +```cpp +operator == +``` +**Description** +`true` if the contents of the maps are equal, otherwise `false`. + +--- + +```cpp +operator != +``` +**Description** +`true` if the contents of the maps are not equal, otherwise `false`. + +## Technical stuff + +Reference flat maps are different from the normal version in that the elements are not copied, but linked directly. +This means that the lifetime of the element inserted must be as great as that of the map that contains it. +Unlike most other reference containers, the map has a finite capacity. + +Flat maps are usually implemented internally as a sorted vector of key/value pairs. Whilst this makes searching fast, it can have a detrimental effect when items are inserted into a container that stores complex, non-trivial keys or values. +As inserting requires that all of the items above the insert position must be shifted, this can become an expensive operation for larger containers. + +To improve insertion performance ETL reference flat maps are implemented as vectors of pointers to key/value pairs, sorted by key value. An insertion will involve a copy of a range of pointers; an operation that can be made very fast. + +The downside is that access to an item via an iterator will involve one indirection and the overhead of the container will be one pointer per item. A normal flat map implementation does not have this overhead. + diff --git a/docs/containers/maps/unordered-map.md b/docs/containers/maps/unordered-map.md new file mode 100644 index 00000000..bf2810ad --- /dev/null +++ b/docs/containers/maps/unordered-map.md @@ -0,0 +1,375 @@ +--- +title: "unordered_map" +--- + +{{< callout type="info">}} + Header: `unordered_map.h` + Similar to: `std::unordered_map` +{{< /callout >}} + +A fixed capacity unordered map. +Uses `std::less` as the default key comparison method. + +This page just describes etl::unordered_map. + +```cpp +template , + typename TKeyEqual = etl::equal_to> +class unordered_map +``` + +Inherits from `iunordered_map`. +`etl::iunordered_map` may be used as a size independent pointer or reference type for any `etl::unordered_map` instance. + +## Template deduction guides +C++17 and above + +```cpp +template +etl::unordered_map(TPairs...) +``` + +### Example +```cpp +etl::unordered_map data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} }; +``` +Defines data as an unordered map of `int`/`int` pairs, of length 4, containing the supplied data. + +## Make template +C++11 and above + +```cpp +template , + typename TKeyEqual = etl::equal_to + typename... TPairs> +constexpr auto make_unordered_map(TValues&&... values) +``` + +### Example +```cpp +auto data = etl::make_unordered_map(etl::pair{0, 1}, etl::pair{2, 3}, + etl::pair{4, 5}, etl::pair{6, 7}); +``` + +## Member types + +```cpp +value_type pair +key_type The type of the key value +mapped_type The type of the mapped value +hasher The type used to hash the key +key_equal The functor used to compare keys +reference A reference to a value_type +const_reference A reference to a const value_type +pointer A pointer to a value_type +const_pointer A pointer to a const value_type +size_type The type used for size information +iterator Random access iterator +const_iterator Constant random access iterator +local_iterator Iterator to a bucket +local_const_iterator A const iterator to a bucket +``` + +## Constructor + +```cpp +unordered_map() +``` +**Description** +Default constructor + +--- + +```cpp +unordered_map(const unordered_map& other) +``` +**Description** +Copy constructor + +--- + +```cpp +template +unordered_map(TIterator begin, TIterator end) +``` +**Description** +Construct from a range + +## Element access + +```cpp +mapped_type& at(key_parameter_t key) +const mapped_type& at(key_parameter_t key) const +``` +**Description** +Returns a reference or const reference to the indexed element. +Raises an `etl::unordered_map_out_of_range` if the key is not in the table. +If assert or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +mapped_type& operator[](key_parameter_t key) +``` +**Description** +Returns a reference to the indexed element. +If the key does not exist then one is created using the default constructor. +If the map is full then emits an `etl::unordered_map_full`. +If asserts or exceptions are not enabled then undefined behaviour occurs. + +--- + +```cpp +iterator find(key_parameter_t key); +const_iterator find (key_parameter_t key) const +``` +**Description** +Searches the container for an element with a key equivalent to key and returns an iterator to it if found, otherwise it returns an iterator to `etl::unordered_map::end()`. + +--- + +```cpp +bool contains(const_key_reference key) const +``` +**Description** +Check if the map contains the key. + +--- + +```cpp +template +bool contains(const K& key) const +``` +**Description** +Check if the map contains the key. +Enabled if the comparator is transparent. + +--- + +```cpp +size_type count(key_parameter_t key) const +``` +**Description** +Count elements with a specific key. +Searches the container for elements with a key equivalent to key and returns the number of matches + +--- + +```cpp +iterator lower_bound(key_parameter_t key) +const_iterator lower_bound(key_parameter_t key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is not considered to go before key (i.e., either it is equivalent or goes after). + +--- + +```cpp +iterator upper_bound(key_parameter_t key) +const_iterator upper_bound(key_parameter_t key) const +``` +**Description** +Returns an iterator pointing to the first element in the container whose key is considered to go after key. + +--- + +```cpp +pair equal_range(key_parameter_t key) +pair equal_range(key_parameter_t key) const +``` +**Description** +Returns the bounds of a range that includes all the elements in the container which have a key equivalent to key. + +## Iterators + +```cpp +iterator begin() +const_iterator begin() const +const_iterator cbegin() const +``` +**Description** +Returns an iterator to the beginning of the map. + +--- + +```cpp +iterator end() +const_iterator end() const +const_iterator cend() const +``` +**Description** +Returns an iterator to the end of the map. + +## Capacity + +```cpp +bool empty() const +``` +**Description** +Returns `true` if the size of the map is zero, otherwise `false`. + +--- + +```cpp +bool full() const +``` +**Description** +Returns `true` if the size of the map is `SIZE`, otherwise `false`. + +--- + +```cpp +size_t size() const +``` +**Description** +Returns the size of the map. + +--- + +```cpp +size_t max_size() const +``` +**Description** +Returns the maximum possible size of the map. + +--- + +```cpp +size_t available() const +``` +**Description** +Returns the remaining available capacity in the map. + +--- + +```cpp +size_type get_bucket_index(key_parameter_t key) const +``` +**Description** +Returns the bucket index for the key. + +--- + +```cpp +size_type bucket_size(key_parameter_t key) const +``` +**Description** +Returns the size of the bucket key. + +--- + +```cpp +size_type max_bucket_count() const +``` +**Description** +Returns the maximum number of the buckets the container can hold. + +--- + +```cpp +float load_factor() const +``` +**Description** +Returns the load factor = size / bucket_count + +--- + +```cpp +hasher hash_function() const +``` +**Description** +Returns the function that hashes the keys. + +--- + +```cpp +key_equal key_eq() const +``` +**Description** +Returns the function that compares the keys. + +## Modifiers + +```cpp +template +void assign(TIterator first, TIterator last) +``` +**Description** +Assigns elements from the range [`first`, `last`)]. +Clears the container before assigning. + +--- + +```cpp +pair insert(const value_type& key_value_pair) +iterator insert(const_iterator, const value_type& key_value_pair) +``` +**Description** +Assigns elements from the range [`first`, `last`)]. +Clears the container before assigning. + +--- + +```cpp +template