Table of Contents
Defined in header sfl/multimap.hpp
:
namespace sfl
{
template < typename Key,
typename T,
typename Compare = std::less<Key>,
typename Allocator = std::allocator<std::pair<const Key, T>> >
class multimap;
}
sfl::multimap
is an associative container equivalent to std::multimap
.
Underlying storage is implemented as red-black tree.
Complexity of search, insert and remove operations is O(log N).
Iterators to elements are bidirectional iterators and they meet the requirements of LegacyBidirectionalIterator.
sfl::multimap
meets the requirements of Container, AllocatorAwareContainer, ReversibleContainer and AssociativeContainer.
-
typename Key
Key type.
-
typename T
Value type.
-
typename Compare
Ordering function for keys.
-
typename Allocator
Allocator used for memory allocation/deallocation and construction/destruction of elements.
This type must meet the requirements of Allocator.
The program is ill-formed if
Allocator::value_type
is not the same asstd::pair<const Key, T>
.
Member Type | Definition |
---|---|
allocator_type |
Allocator |
key_type |
Key |
mapped_type |
T |
value_type |
std::pair<const Key, T> |
size_type |
Unsigned integer type |
difference_type |
Signed integer type |
key_compare |
Compare |
reference |
value_type& |
const_reference |
const value_type& |
pointer |
Pointer to value_type |
const_pointer |
Pointer to const value_type |
iterator |
LegacyBidirectionalIterator to value_type |
const_iterator |
LegacyBidirectionalIterator to const value_type |
reverse_iterator |
Reverse LegacyBidirectionalIterator to value_type |
const_reverse_iterator |
Reverse LegacyBidirectionalIterator to const value_type |
class value_compare
{
public:
bool operator()(const value_type& x, const value_type& y) const;
};
-
multimap() noexcept( std::is_nothrow_default_constructible<Allocator>::value && std::is_nothrow_default_constructible<Compare>::value );
-
explicit multimap(const Compare& comp) noexcept( std::is_nothrow_default_constructible<Allocator>::value && std::is_nothrow_copy_constructible<Compare>::value );
-
explicit multimap(const Allocator& alloc) noexcept( std::is_nothrow_copy_constructible<Allocator>::value && std::is_nothrow_default_constructible<Compare>::value );
-
explicit multimap(const Compare& comp, const Allocator& alloc) noexcept( std::is_nothrow_copy_constructible<Allocator>::value && std::is_nothrow_copy_constructible<Compare>::value );
Effects: Constructs an empty container.
Complexity: Constant.
-
template <typename InputIt> multimap(InputIt first, InputIt last);
-
template <typename InputIt> multimap(InputIt first, InputIt last, const Compare& comp);
-
template <typename InputIt> multimap(InputIt first, InputIt last, const Allocator& alloc);
-
template <typename InputIt> multimap(InputIt first, InputIt last, const Compare& comp, const Allocator& alloc);
Effects: Constructs the container with the contents of the range
[first, last)
.Note: These overloads participate in overload resolution only if
InputIt
satisfies requirements of LegacyInputIterator. -
multimap(std::initializer_list<value_type> ilist);
-
multimap(std::initializer_list<value_type> ilist, const Compare& comp);
-
multimap(std::initializer_list<value_type> ilist, const Allocator& alloc);
-
multimap(std::initializer_list<value_type> ilist, const Compare& comp, const Allocator& alloc);
Effects: Constructs the container with the contents of the initializer list
ilist
. -
multimap(const multimap& other);
-
multimap(const multimap& other, const Allocator& alloc);
Effects: Copy constructor. Constructs the container with the copy of the contents of
other
. -
multimap(multimap&& other);
-
multimap(multimap&& other, const Allocator& alloc);
Effects: Move constructor. Constructs the container with the contents of
other
using move semantics.other
is not guaranteed to be empty after the move.other
is in a valid but unspecified state after the move. -
template <typename Range> multimap(sfl::from_range_t, Range&& range);
-
template <typename Range> multimap(sfl::from_range_t, Range&& range, const Compare& comp);
-
template <typename Range> multimap(sfl::from_range_t, Range&& range, const Allocator& alloc);
-
template <typename Range> multimap(sfl::from_range_t, Range&& range, const Compare& comp, const Allocator& alloc);
Effects: Constructs the container with the contents of
range
.Note: It is available in C++11. In C++20 are used proper C++20 range concepts.
-
~multimap();
Effects: Destructs the container. The destructors of the elements are called and the used storage is deallocated.
Complexity: Linear in
size()
.
-
multimap& operator=(const multimap& other);
Effects: Copy assignment operator. Replaces the contents with a copy of the contents of
other
.Returns:
*this()
. -
multimap& operator=(multimap&& other);
Effects: Move assignment operator. Replaces the contents with those of
other
using move semantics.other
is not guaranteed to be empty after the move.other
is in a valid but unspecified state after the move.Returns:
*this()
. -
multimap& operator=(std::initializer_list<value_type> ilist);
Effects: Replaces the contents with those identified by initializer list
ilist
.Returns:
*this()
.
-
allocator_type get_allocator() const noexcept;
Effects: Returns the allocator associated with the container.
Complexity: Constant.
-
key_compare key_comp() const;
Effects: Returns the function object that compares the keys, which is a copy of this container's constructor argument
comp
.Complexity: Constant.
-
value_compare value_comp() const;
Effects: Returns a function object that compares objects of type
value_type
.Complexity: Constant.
-
iterator begin() noexcept;
-
const_iterator begin() const noexcept;
-
const_iterator cbegin() const noexcept;
Effects: Returns an iterator to the first element of the container. If the container is empty, the returned iterator will be equal to
end()
.Complexity: Constant.
-
iterator end() noexcept;
-
const_iterator end() const noexcept;
-
const_iterator cend() const noexcept;
Effects: Returns an iterator to the element following the last element of the container. This element acts as a placeholder; attempting to access it results in undefined behavior.
Complexity: Constant.
-
reverse_iterator rbegin() noexcept;
-
const_reverse_iterator rbegin() const noexcept;
-
const_reverse_iterator crbegin() const noexcept;
Effects: Returns a reverse iterator to the first element of the reversed container. It corresponds to the last element of the non-reversed container. If the container is empty, the returned iterator is equal to
rend()
.Complexity: Constant.
-
reverse_iterator rend() noexcept;
-
const_reverse_iterator rend() const noexcept;
-
const_reverse_iterator crend() const noexcept;
Effects: Returns a reverse iterator to the element following the last element of the reversed container. It corresponds to the element preceding the first element of the non-reversed container. This element acts as a placeholder, attempting to access it results in undefined behavior.
Complexity: Constant.
-
bool empty() const noexcept;
Effects: Returns
true
if the container has no elements, i.e. whetherbegin() == end()
.Complexity: Constant.
-
size_type size() const noexcept;
Effects: Returns the number of elements in the container, i.e.
std::distance(begin(), end())
.Complexity: Constant.
-
size_type max_size() const noexcept;
Effects: Returns the maximum number of elements the container is able to hold, i.e.
std::distance(begin(), end())
for the largest container.Complexity: Constant.
-
void clear() noexcept;
Effects: Erases all elements from the container. After this call,
size()
returns zero andcapacity()
remains unchanged.Complexity: Linear in
size()
.
-
template <typename... Args> iterator emplace(Args&&... args);
Effects: Inserts a new element into the container.
New element is constructed as
value_type(std::forward<Args>(args)...)
.Returns: Iterator to the inserted element.
-
template <typename... Args> iterator emplace_hint(const_iterator hint, Args&&... args);
Effects: Inserts a new element into the container.
New element is constructed as
value_type(std::forward<Args>(args)...)
.Iterator
hint
is used as a suggestion where to start to search insert position.Returns: Iterator to the inserted element.
-
iterator insert(const value_type& value);
Effects: Inserts copy of
value
.Returns: Iterator to the inserted element.
-
iterator insert(value_type&& value);
Effects: Inserts
value
using move semantics.Returns: Iterator to the inserted element.
-
template <typename P> iterator insert(P&& value);
Effects: Inserts a new element into the container.
New element is constructed as
value_type(std::forward<P>(value))
.Note: This overload participates in overload resolution only if
std::is_constructible<value_type, P&&>::value
istrue
.Returns: Iterator to the inserted element.
-
iterator insert(const_iterator hint, const value_type& value);
Effects: Inserts copy of
value
.Iterator
hint
is used as a suggestion where to start to search insert position.Returns: Iterator to the inserted element.
-
iterator insert(const_iterator hint, value_type&& value);
Effects: Inserts
value
using move semantics.Iterator
hint
is used as a suggestion where to start to search insert position.Returns: Iterator to the inserted element.
-
template <typename P> iterator insert(const_iterator hint, P&& value);
Effects: Inserts a new element into the container.
New element is constructed as
value_type(std::forward<P>(value))
.Iterator
hint
is used as a suggestion where to start to search insert position.Note: This overload participates in overload resolution only if
std::is_constructible<value_type, P&&>::value
istrue
.Returns: Iterator to the inserted element.
-
template <typename InputIt> void insert(InputIt first, InputIt last);
Effects: Inserts elements from range
[first, last)
.The call to this function is equivalent to:
while (first != last) { insert(*first); ++first; }
Note: This overload participates in overload resolution only if
InputIt
satisfies requirements of LegacyInputIterator. -
void insert(std::initializer_list<value_type> ilist);
Effects: Inserts elements from initializer list
ilist
.The call to this function is equivalent to
insert(ilist.begin(), ilist.end())
.
-
template <typename Range> void insert_range(Range&& range);
Effects: Inserts elements from
range
.Note: It is available in C++11. In C++20 are used proper C++20 range concepts.
-
iterator erase(iterator pos);
-
iterator erase(const_iterator pos);
Effects: Removes the element at
pos
.Returns: Iterator following the last removed element.
-
iterator erase(const_iterator first, const_iterator last);
Effects: Removes the elements in the range
[first, last)
.Returns: Iterator following the last removed element.
-
size_type erase(const Key& key);
-
template <typename K> size_type erase(K&& x);
Effects: Removes all elements with the key equivalent to
key
orx
.Note: Overload (5) participates in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling this function without constructing an instance ofKey
.Returns: Number of elements removed.
-
void swap(multimap& other);
Effects: Exchanges the contents of the container with those of
other
.
-
iterator lower_bound(const Key& key);
-
const_iterator lower_bound(const Key& key) const;
-
template <typename K> iterator lower_bound(const K& x);
-
template <typename K> const_iterator lower_bound(const K& x) const;
Effects: Returns an iterator pointing to the first element with key that compares not less than
key
orx
. Returnsend()
if no such element is found.Note: Overloads (3) and (4) participate in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling these functions without constructing an instance ofKey
.Complexity: Logarithmic in
size()
.
-
iterator upper_bound(const Key& key);
-
const_iterator upper_bound(const Key& key) const;
-
template <typename K> iterator upper_bound(const K& x);
-
template <typename K> const_iterator upper_bound(const K& x) const;
Effects: Returns an iterator pointing to the first element with key that compares greater than
key
orx
. Returnsend()
if no such element is found.Note: Overloads (3) and (4) participate in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling these functions without constructing an instance ofKey
.Complexity: Logarithmic in
size()
.
-
std::pair<iterator, iterator> equal_range(const Key& key);
-
std::pair<const_iterator, const_iterator> equal_range(const Key& key) const;
-
template <typename K> std::pair<iterator, iterator> equal_range(const K& x);
-
template <typename K> std::pair<const_iterator, const_iterator> equal_range(const K& x) const;
Effects: Returns a range containing all elements with key that compares equivalent to
key
orx
.- The first iterator in pair points to the first element that compares not less than
key
orx
. It is equal toend()
if no such element is found. - The second iterator in pair points to the first element that compares greater than
key
orx
. It is equal toend()
is no such element is found.
Note: Overloads (3) and (4) participate in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling these functions without constructing an instance ofKey
.Complexity: Logarithmic in
size()
. - The first iterator in pair points to the first element that compares not less than
-
iterator find(const Key& key);
-
const_iterator find(const Key& key) const;
-
template <typename K> iterator find(const K& x);
-
template <typename K> const_iterator find(const K& x) const;
Effects: Returns an iterator pointing to the element with key equivalent to
key
orx
. Returnsend()
if no such element is found. If there are several elements with key in the container, any of them may be returned.Note: Overloads (3) and (4) participate in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling these functions without constructing an instance ofKey
.Complexity: Logarithmic in
size()
.
-
size_type count(const Key& key) const;
-
template <typename K> size_type count(const K& x) const;
Effects: Returns the number of elements with key equivalent to
key
orx
.Note: Overload (2) participates in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling this function without constructing an instance ofKey
.Complexity: Logarithmic in
size()
plus linear in the number of the elements found.
-
bool contains(const Key& key) const;
-
template <typename K> bool contains(const K& x) const;
Effects: Returns
true
if the container contains an element with key equivalent tokey
orx
, otherwise returnsfalse
.Note: Overload (2) participates in overload resolution only if
Compare::is_transparent
exists and is a valid type. It allows calling this function without constructing an instance ofKey
.Complexity: Logarithmic in
size()
.
-
template <typename K, typename T, typename C, typename A> bool operator== ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Checks if the contents of
x
andy
are equal.The contents of
x
andy
are equal if the following conditions hold:x.size() == y.size()
- Each element in
x
compares equal with the element iny
at the same position.
The comparison is performed by
std::equal
. This comparison ignores the container's orderingCompare
.Returns: Returns
true
if the contents of thex
andy
are equal,false
otherwise.
-
template <typename K, typename T, typename C, typename A> bool operator!= ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Checks if the contents of
x
andy
are equal.For details see
operator==
.Returns: Returns
true
if the contents of thex
andy
are not equal,false
otherwise.
-
template <typename K, typename T, typename C, typename A> bool operator< ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Compares the contents of
x
andy
lexicographically. The comparison is performed by a functionstd::lexicographical_compare
. This comparison ignores the container's orderingCompare
.Returns:
true
if the contents of thex
are lexicographically less than the contents ofy
,false
otherwise.
-
template <typename K, typename T, typename C, typename A> bool operator> ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Compares the contents of lhs and rhs lexicographically.
The comparison is performed by a function
std::lexicographical_compare
. This comparison ignores the container's orderingCompare
.Returns:
true
if the contents of thex
are lexicographically greater than the contents ofy
,false
otherwise.
-
template <typename K, typename T, typename C, typename A> bool operator<= ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Compares the contents of
x
andy
lexicographically. The comparison is performed by a functionstd::lexicographical_compare
. This comparison ignores the container's orderingCompare
.Returns:
true
if the contents of thex
are lexicographically less than or equal to the contents ofy
,false
otherwise.
-
template <typename K, typename T, typename C, typename A> bool operator>= ( const multimap<K, T, C, A>& x, const multimap<K, T, C, A>& y );
Effects: Compares the contents of
x
andy
lexicographically. The comparison is performed by a functionstd::lexicographical_compare
. This comparison ignores the container's orderingCompare
.Returns:
true
if the contents of thex
are lexicographically greater than or equal to the contents ofy
,false
otherwise.
-
template <typename K, typename T, typename C, typename A> void swap ( multimap<K, T, C, A>& x, multimap<K, T, C, A>& y );
Effects: Swaps the contents of
x
andy
. Callsx.swap(y)
.
-
template <typename K, typename T, typename C, typename A, typename Predicate> typename multimap<K, T, C, A>::size_type erase_if(multimap<K, T, C, A>& c, Predicate pred);
Effects: Erases all elements that satisfy the predicate
pred
from the container.pred
is unary predicate which returnstrue
if the element should be removed.Returns: The number of erased elements.
End of document.