(C++17) | ||||
| Sequence | ||||
(C++11) | ||||
(C++26) | ||||
(C++26) | ||||
(C++11) | ||||
| Associative | ||||
| Unordered associative | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
| Adaptors | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
| Views | ||||
(C++20) | ||||
(C++23) | ||||
| Tables | ||||
| Iterator invalidation | ||||
| Member function table | ||||
| Non-member function table |
| Member functions | ||||||||||||
| ||||||||||||
| Non-member functions | ||||||||||||
| ||||||||||||
| Deduction guides(C++17) | ||||||||||||
| (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, | (4) | (constexpr since C++26) |
template<class InputIt> multimap( InputIt first, InputIt last, | (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(), | (10) | (since C++11) (constexpr since C++26) |
multimap(std::initializer_list<value_type> init, const Allocator& alloc) | (11) | (since C++14) (constexpr since C++26) |
template<container-compatible-range<value_type> R> multimap(std::from_range_t, R&& rg, | (12) | (since C++23) (constexpr since C++26) |
template<container-compatible-range<value_type> R> multimap(std::from_range_t, R&& rg, | (13) | (since C++23) (constexpr since C++26) |
Constructs new container from a variety of data sources and optionally using user supplied allocatoralloc or comparison function objectcomp.
[first, last).[first, last) is not avalid range, the behavior is undefined.Ifalloc is not provided, allocator is obtained by callingstd::allocator_traits<allocator_type>:: | (since C++11) |
Duringclass template argument deduction, only the first argument contributes to the deduction of the container's | (since C++23) |
Duringclass template argument deduction, only the first argument contributes to the deduction of the container's | (since C++23) |
Contents |
| 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 sourcerange 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 | - | acontainer compatible range, that is, aninput_range whose elements are convertible tovalue_type |
| Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-Compare must meet the requirements ofCompare. | ||
-Allocator must meet the requirements ofAllocator. | ||
[first, last) is already sorted byvalue_comp().Calls toAllocator::allocate may throw.
After container move construction (overload(8,9)), references, pointers, and iterators (other than the end iterator) toother 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 viaLWG issue 2321.
Although not formally required until C++23, some implementations has already put the template parameterAllocator intonon-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) |
#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,conststd::multimap<Key, Value, Cmp>& map){std::cout<< rem<<"{ ";for(auto n{map.size()};constauto& 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 comparisonstd::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>;constauto rg={PS{3,"Earth"},{2,"Venus"},{1,"Mercury"},{3,"Moon"}};#if __cpp_lib_containers_rangesstd::multimap<int,std::string> m2(std::from_range, rg);// overload (12)#elsestd::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 5The magnitude of (3, -3) is -1The magnitude of (5, 12) is 13The magnitude of (8, 15) is 17Construction from a range:m2 = { [1:Mercury], [2:Venus], [3:Earth], [3:Moon] }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 requiredKeyandT to beCopyInsertable into*this | not required |
| LWG 2193 | C++11 | the default constructor was explicit | made non-explicit |
| assigns values to the container (public member function)[edit] |