(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 |
std::map| Member functions | |||||||
| Non-member functions | |||||||
| |||||||
| Deduction guides(C++17) | |||||||
| (1) | ||
map(); | (until C++11) | |
map(): map(Compare()){} | (since C++11) (constexpr since C++26) | |
explicit map(const Compare& comp, const Allocator& alloc= Allocator()); | (2) | (constexpr since C++26) |
explicit map(const Allocator& alloc); | (3) | (since C++11) (constexpr since C++26) |
template<class InputIt> map( InputIt first, InputIt last, | (4) | (constexpr since C++26) |
template<class InputIt> map( InputIt first, InputIt last, | (5) | (since C++14) (constexpr since C++26) |
map(const map& other); | (6) | (constexpr since C++26) |
map(const map& other,const Allocator& alloc); | (7) | (since C++11) (constexpr since C++26) |
map( map&& other); | (8) | (since C++11) (constexpr since C++26) |
map( map&& other,const Allocator& alloc); | (9) | (since C++11) (constexpr since C++26) |
map(std::initializer_list<value_type> init, const Compare& comp= Compare(), | (10) | (since C++11) (constexpr since C++26) |
map(std::initializer_list<value_type> init, const Allocator& alloc) | (11) | (since C++14) (constexpr since C++26) |
template<container-compatible-range<value_type> R> map(std::from_range_t, R&& rg, | (12) | (since C++23) (constexpr since C++26) |
template<container-compatible-range<value_type> R> map(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.
If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted (pendingLWG2844).
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 <iomanip>#include <iostream>#include <map>#include <string> template<typename Key,typename Value,typename Cmp>std::ostream& operator<<(std::ostream& os,conststd::map<Key, Value, Cmp>& map){ os<<"{ ";for(auto comma{map.size()};constauto& p: map) os<<'\''<< p.first<<"' is "<< p.second<<(--comma?", ":" ");return os<<"}\n";} struct Point{double x, y; friendstd::ostream& operator<<(std::ostream& os, Point pt){return os<<'('<< pt.x<<", "<< pt.y<<')';}}; struct PointCmp{bool operator()(const Point& lhs,const Point& rhs)const{return lhs.x< rhs.x;// NB: y is intentionally ignored}}; int main(){// (1) Default constructorstd::map<std::string,int> map1; map1["something"]=69; map1["anything"]=199; map1["that thing"]=50;std::cout<<"map1 = "<< map1; // (4) Range constructorstd::map<std::string,int> iter(map1.find("anything"), map1.end());std::cout<<"\niter = "<< iter;std::cout<<"map1 = "<< map1; // (6) Copy constructorstd::map<std::string,int> copied(map1);std::cout<<"\ncopied = "<< copied;std::cout<<"map1 = "<< map1; // (8) Move constructorstd::map<std::string,int> moved{std::move(map1)};std::cout<<"\nmoved = "<< moved;std::cout<<"map1 = "<< map1; // (10) Initializer list constructorconststd::map<std::string,int> init{{"this",100},{"can",100},{"be",100},{"const",100}};std::cout<<"\ninit = "<< init; std::cout<<"\nCustom Key class option 1:\n";// Use a comparison structstd::map<Point,double, PointCmp> mag={{{5,-12},13},{{3,4},5},{{-8,-15},17}};std::cout<<"mag = "<< mag<<'\n'; std::cout<<"Custom Key class option 2:\n";// Use a comparison lambda// This lambda sorts points according to their magnitudes, where// these magnitudes are taken from the local variable mag.auto cmpLambda=[&mag](const Point& lhs,const Point& rhs){return mag[lhs]< mag[rhs];}; // You could also use a lambda that is not dependent on local variables, like this:// auto cmpLambda = [](const Point& lhs, const Point& rhs){ return lhs.y < rhs.y; };std::map<Point,double, decltype(cmpLambda)> magy(cmpLambda); // Various ways of inserting elements: magy.insert(std::pair<Point,double>({5,-12},13)); magy.insert({{3,4},5}); magy.insert({Point{-8.0,-15.0},17});std::cout<<"magy = "<< magy<<'\n'; std::cout<<"Construction from a range:\n";using PS=std::pair<conststd::string,int>;constauto rg={PS{"one",1},{"one",101},{"two",2},{"three",3}};#if __cpp_lib_containers_rangesstd::map<std::string,int> nums(std::from_range, rg);// overload (12)#elsestd::map<std::string,int> nums(rg.begin(), rg.end());// fallback to (4)#endifstd::cout<<"nums = "<< nums<<'\n';}
Output:
map1 = { 'anything' is 199, 'something' is 69, 'that thing' is 50 } iter = { 'anything' is 199, 'something' is 69, 'that thing' is 50 }map1 = { 'anything' is 199, 'something' is 69, 'that thing' is 50 } copied = { 'anything' is 199, 'something' is 69, 'that thing' is 50 }map1 = { 'anything' is 199, 'something' is 69, 'that thing' is 50 } moved = { 'anything' is 199, 'something' is 69, 'that thing' is 50 }map1 = { } init = { 'be' is 100, 'can' is 100, 'const' is 100, 'this' is 100 } Custom Key class option 1:mag = { '(-8, -15)' is 17, '(3, 4)' is 5, '(5, -12)' is 13 } Custom Key class option 2:magy = { '(3, 4)' is 5, '(5, -12)' is 13, '(-8, -15)' is 17 } Construction from a range:nums = { 'one' is 1, 'three' is 3, 'two' is 2 }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] |