Namespaces
Variants
Actions

std::multimap<Key,T,Compare,Allocator>::multimap

From cppreference.com
< cpp‎ | container‎ | multimap
 
 
 
 
(1)
multimap();
(until C++11)
multimap() : multimap(Compare()) {}
(since C++11)
(constexpr since C++26)
explicit multimap( const Compare& comp,
                   const Allocator& alloc = Allocator() );
(2) (constexpr since C++26)
explicit multimap( const Allocator& alloc );
(3) (since C++11)
(constexpr since C++26)
template< class InputIt >

multimap( InputIt first, InputIt last,
          const Compare& comp = Compare(),

          const Allocator& alloc = Allocator() );
(4) (constexpr since C++26)
template< class InputIt >

multimap( InputIt first, InputIt last,
          const Allocator& alloc )

    : multimap(first, last, Compare(), alloc) {}
(5) (since C++14)
(constexpr since C++26)
multimap( const multimap& other );
(6) (constexpr since C++26)
multimap( const multimap& other, const Allocator& alloc );
(7) (since C++11)
(constexpr since C++26)
multimap( multimap&& other );
(8) (since C++11)
(constexpr since C++26)
multimap( multimap&& other, const Allocator& alloc );
(9) (since C++11)
(constexpr since C++26)
multimap( std::initializer_list<value_type> init,

          const Compare& comp = Compare(),

          const Allocator& alloc = Allocator() );
(10) (since C++11)
(constexpr since C++26)
multimap( std::initializer_list<value_type> init,

          const Allocator& alloc )

    : multimap(init, Compare(), alloc) {}
(11) (since C++14)
(constexpr since C++26)
template< container-compatible-range<value_type> R >

multimap( std::from_range_t, R&& rg,
          const Compare& comp = Compare(),

          const Allocator& alloc = Allocator() );
(12) (since C++23)
(constexpr since C++26)
template< container-compatible-range<value_type> R >

multimap( std::from_range_t, R&& rg,
          const Allocator& alloc )

    : multimap(std::from_range, std::forward<R>(rg), Compare(), alloc) {}
(13) (since C++23)
(constexpr since C++26)

Constructs new container from a variety of data sources and optionally using user supplied allocator alloc or comparison function object comp.

1-3) Constructs an empty container.
4,5) Constructs the container with the contents of the range [firstlast).
If [firstlast) is not a valid range, the behavior is undefined.
6,7) Constructs the container with the copy of the contents of other.

If alloc is not provided, allocator is obtained by calling std::allocator_traits<allocator_type>::
    select_on_container_copy_construction(other.get_allocator())
.

(since C++11)

During class template argument deduction, only the first argument contributes to the deduction of the container's Allocator template parameter.

(since C++23)
8,9) Constructs the container with the contents of other using move semantics. If alloc is not provided, allocator is obtained by move-construction from the allocator belonging to other.

During class template argument deduction, only the first argument contributes to the deduction of the container's Allocator template parameter.

(since C++23)
10,11) Constructs the container with the contents of the initializer list init.
12,13) Constructs the container with the contents of rg.

Contents

[edit] Parameters

alloc - allocator to use for all memory allocations of this container
comp - comparison function object to use for all comparisons of keys
first, last - the pair of iterators defining the source range of elements to copy
other - another container to be used as source to initialize the elements of the container with
init - initializer list to initialize the elements of the container with
rg - a container compatible range, that is, an input_range whose elements are convertible to value_type
Type requirements
-
InputIt must meet the requirements of LegacyInputIterator.
-
Compare must meet the requirements of Compare.
-
Allocator must meet the requirements of Allocator.

[edit] Complexity

1-3) Constant.
4,5) N·log(N) where N is std::distance(first, last) in general, linear in N if [firstlast) is already sorted by value_comp().
6,7) Linear in size of other.
8,9) Constant. If alloc is given and alloc != other.get_allocator(), then linear.
10,11) N·log(N) where N is init.size() in general, linear in N if init is already sorted by value_comp().
12,13) N·log(N) where N is ranges::distance(rg) in general, linear in N if rg is already sorted by value_comp().

[edit] Exceptions

Calls to Allocator::allocate may throw.

[edit] Notes

After container move construction (overload (8,9)), references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.reqmts]/67, and a more direct guarantee is under consideration via LWG issue 2321.

Although not formally required until C++23, some implementations has already put the template parameter Allocator into non-deduced contexts in earlier modes.

Feature-test macro Value Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Ranges-aware construction and insertion; overloads (12,13)

[edit] Example

#include <iostream>
#include <map>
#include <utility>
 
struct Point { double x, y; };
 
struct PointCmp
{
    bool operator()(const Point& lhs, const Point& rhs) const
    {
        return lhs.x < rhs.x; // NB. ignores y on purpose
    }
};
 
template <typename Key, typename Value, typename Cmp>
void println(auto rem, const std::multimap<Key, Value, Cmp>& map)
{
    std::cout << rem << "{ ";
    for (auto n{map.size()}; const auto& p : map)
        std::cout << '[' << p.first << ":" << p.second << (--n ? "], " : "]");
    std::cout << " }\n";
}
 
int main()
{
    std::multimap<int, int> m1 =
    {
        {1, 1}, {2, 2}, {3, 3}, {4, 4}, {4, 4}, {3, 3}, {2, 2}, {1, 1}
    };
    println("m1 = ", m1);
 
    // Custom comparison
    std::multimap<Point, double, PointCmp> mag
    {
        {{5, 12}, 13},
        {{3, 4}, 5},
        {{8, 15}, 17},
        {{3, -3}, -1}
    };
    for (auto p : mag)
        std::cout << "The magnitude of (" << p.first.x << ", " << p.first.y << ")"
                     " is " << p.second << '\n';
 
    std::cout << "Construction from a range:\n";
    using PS = std::pair<int, std::string>;
    const auto rg = {PS{3, "Earth"}, {2, "Venus"}, {1, "Mercury"}, {3, "Moon"}};
#if __cpp_lib_containers_ranges
    std::multimap<int, std::string> m2(std::from_range, rg); // overload (12)
#else
    std::multimap<int, std::string> m2(rg.begin(), rg.end()); // fallback to (4)
#endif
    println("m2 = ", m2);
}

Output:

m1 = { [1:1], [1:1], [2:2], [2:2], [3:3], [3:3], [4:4], [4:4] }
The magnitude of (3, 4) is 5
The magnitude of (3, -3) is -1
The magnitude of (5, 12) is 13
The magnitude of (8, 15) is 17
Construction from a range:
m2 = { [1:Mercury], [2:Venus], [3:Earth], [3:Moon] }

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 2076 C++11 overload (4) conditionally required Keyand T to be CopyInsertable into *this not required
LWG 2193 C++11 the default constructor was explicit made non-explicit

[edit] See also

assigns values to the container
(public member function) [edit]