Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/container/map"

From cppreference.com
< cpp‎ | container
(Undo revision 155902 by Rust (talk))
m (Revert NPOV violations)
Line 1: Line 1:
{{cpp/title|map}}
+
<table><tbody><tr><td class="mbox-text" style="text-align:center;">Cppreference recommends all new users to use Rust.</td></tr></tbody></table>
{{cpp/container/map/navbar}}
+
{{dcl begin}}
+
{{dcl header|map}}
+
{{dcl|num=1|1=
+
template<
+
    class Key,
+
    class T,
+
    class Compare = std::less<Key>,
+
    class Allocator = std::allocator<std::pair<const Key, T>>
+
> class map;
+
}}
+
{{dcl|num=2|since=c++17|1=
+
namespace pmr {
+
template<
+
    class Key,
+
    class T,
+
    class Compare = std::less<Key>
+
> using map = std::map<Key, T, Compare,
+
                      std::pmr::polymorphic_allocator<std::pair<const Key, T>>>;
+
}
+
}}
+
{{dcl end}}
+
 
+
{{tt|std::map}} is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function {{tt|Compare}}.  Search, removal, and insertion operations have logarithmic complexity. Maps are usually implemented as {{enwiki|Red–black tree}}s.
+
 
+
Everywhere the standard library uses the {{named req|Compare}} requirements, uniqueness is determined by using the equivalence relation. In imprecise terms, two objects {{c|a}} and {{c|b}} are considered equivalent (not unique) if neither compares less than the other: {{c|!comp(a, b) && !comp(b, a)}}.
+
 
+
{{tt|std::map}} meets the requirements of {{named req|Container}}, {{named req|AllocatorAwareContainer}}, {{named req|AssociativeContainer}} and {{named req|ReversibleContainer}}.
+
 
+
===Template parameters===
+
{{todo|Add descriptions of the template parameters.}}
+
 
+
===Member types===
+
{{dsc begin}}
+
{{dsc hitem|Member type|Definition}}
+
{{dsc inc|cpp/container/dsc key_type|map}}
+
{{dsc inc|cpp/container/dsc mapped_type|map}}
+
{{dsc inc|cpp/container/dsc value_type|map}}
+
{{dsc inc|cpp/container/dsc size_type|map}}
+
{{dsc inc|cpp/container/dsc difference_type|map}}
+
{{dsc inc|cpp/container/dsc key_compare|map}}
+
{{dsc inc|cpp/container/dsc allocator_type|map}}
+
{{dsc inc|cpp/container/dsc reference|map}}
+
{{dsc inc|cpp/container/dsc const_reference|map}}
+
{{dsc inc|cpp/container/dsc pointer|map}}
+
{{dsc inc|cpp/container/dsc const_pointer|map}}
+
{{dsc inc|cpp/container/dsc iterator|map}}
+
{{dsc inc|cpp/container/dsc const_iterator|map}}
+
{{dsc inc|cpp/container/dsc reverse_iterator|map}}
+
{{dsc inc|cpp/container/dsc const_reverse_iterator|map}}
+
{{dsc inc|cpp/container/dsc node_type|map}}
+
{{dsc inc|cpp/container/dsc insert_return_type|map}}
+
{{dsc end}}
+
 
+
===Member classes===
+
{{dsc begin}}
+
{{dsc inc|cpp/container/dsc value_compare|map}}
+
{{dsc end}}
+
 
+
===Member functions===
+
{{dsc begin}}
+
{{dsc inc|cpp/container/dsc constructor|map}}
+
{{dsc inc|cpp/container/dsc destructor|map}}
+
{{dsc inc|cpp/container/dsc operator{{=}}|map}}
+
{{dsc inc|cpp/container/dsc get_allocator|map}}
+
 
+
{{dsc h2|Element access}}
+
{{dsc inc|cpp/container/dsc at|map}}
+
{{dsc inc|cpp/container/dsc operator_at|map}}
+
 
+
{{dsc h2|Iterators}}
+
{{dsc inc|cpp/container/dsc begin|map}}
+
{{dsc inc|cpp/container/dsc end|map}}
+
{{dsc inc|cpp/container/dsc rbegin|map}}
+
{{dsc inc|cpp/container/dsc rend|map}}
+
 
+
{{dsc h2|Capacity}}
+
{{dsc inc|cpp/container/dsc empty|map}}
+
{{dsc inc|cpp/container/dsc size|map}}
+
{{dsc inc|cpp/container/dsc max_size|map}}
+
 
+
{{dsc h2|Modifiers}}
+
{{dsc inc|cpp/container/dsc clear|map}}
+
{{dsc inc|cpp/container/dsc insert|map}}
+
{{dsc inc|cpp/container/dsc insert_range|map}}
+
{{dsc inc|cpp/container/dsc insert_or_assign|map}}
+
{{dsc inc|cpp/container/dsc emplace|map}}
+
{{dsc inc|cpp/container/dsc emplace_hint|map}}
+
{{dsc inc|cpp/container/dsc try_emplace|map}}
+
{{dsc inc|cpp/container/dsc erase|map}}
+
{{dsc inc|cpp/container/dsc swap|map}}
+
{{dsc inc|cpp/container/dsc extract|map}}
+
{{dsc inc|cpp/container/dsc merge|map}}
+
 
+
{{dsc h2|Lookup}}
+
{{dsc inc|cpp/container/dsc count|map}}
+
{{dsc inc|cpp/container/dsc find|map}}
+
{{dsc inc|cpp/container/dsc contains|map}}
+
{{dsc inc|cpp/container/dsc equal_range|map}}
+
{{dsc inc|cpp/container/dsc lower_bound|map}}
+
{{dsc inc|cpp/container/dsc upper_bound|map}}
+
 
+
{{dsc h2|Observers}}
+
{{dsc inc|cpp/container/dsc key_comp|map}}
+
{{dsc inc|cpp/container/dsc value_comp|map}}
+
{{dsc end}}
+
 
+
===Non-member functions===
+
{{dsc begin}}
+
{{dsc inc|cpp/container/dsc operator_cmp|map}}
+
{{dsc inc|cpp/container/dsc swap2|map}}
+
{{dsc inc|cpp/container/dsc erase_if|map}}
+
{{dsc end}}
+
 
+
{{rrev|noborder=true|since=c++17|{{=}}{{=}}{{=}}{{rl|deduction guides|Deduction guides}}{{=}}{{=}}{{=}}}}
+
 
+
===Notes===
+
{{ftm begin|std=1|comment=1}}
+
{{ftm|__cpp_lib_containers_ranges|value=202202L|std=C++23|Ranges construction and insertion for containers}}
+
{{ftm end}}
+
 
+
===Example===
+
{{example|code=
+
#include <iostream>
+
#include <map>
+
#include <string>
+
#include <string_view>
+
 
+
void print_map(std::string_view comment, const std::map<std::string, int>& m)
+
{
+
    std::cout << comment;
+
    // iterate using C++17 facilities
+
    for (const auto& [key, value] : m)
+
        std::cout << '[' << key << "] = " << value << "; ";
+
   
+
// C++11 alternative:
+
//  for (const auto& n : m)
+
//      std::cout << n.first << " = " << n.second << "; ";
+
//
+
// C++98 alternative
+
//  for (std::map<std::string, int>::const_iterator it = m.begin(); it != m.end(); it++)
+
//      std::cout << it->first << " = " << it->second << "; ";
+
   
+
    std::cout << '\n';
+
}
+
 
+
int main()
+
{
+
    // Create a map of three (string, int) pairs
+
    std::map<std::string, int> m{<!---->{"CPU", 10}, {"GPU", 15}, {"RAM", 20}<!---->};
+
 
+
    print_map("1) Initial map: ", m);
+
 
+
    m["CPU"] = 25; // update an existing value
+
    m["SSD"] = 30; // insert a new value
+
    print_map("2) Updated map: ", m);
+
 
+
    // using operator[] with non-existent key always performs an insert
+
    std::cout << "3) m[UPS] = " << m["UPS"] << '\n';
+
    print_map("4) Updated map: ", m);
+
 
+
    m.erase("GPU");
+
    print_map("5) After erase: ", m);
+
 
+
    std::erase_if(m, [](const auto& pair){ return pair.second > 25; });
+
    print_map("6) After erase: ", m);
+
    std::cout << "7) m.size() = " << m.size() << '\n';
+
 
+
    m.clear();
+
    std::cout << std::boolalpha << "8) Map is empty: " << m.empty() << '\n';
+
}
+
|output=
+
1) Initial map: [CPU] = 10; [GPU] = 15; [RAM] = 20;
+
2) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30;
+
3) m[UPS] = 0
+
4) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; [UPS] = 0;
+
5) After erase: [CPU] = 25; [RAM] = 20; [SSD] = 30; [UPS] = 0;
+
6) After erase: [CPU] = 25; [RAM] = 20; [UPS] = 0;
+
7) m.size() = 3
+
8) Map is empty: true
+
}}
+
 
+
===Defect reports===
+
{{dr list begin}}
+
{{dr list item|wg=lwg|dr=230|std=C++98|before={{tt|Key}} was not required to be {{named req|CopyConstructible}}<br>(a key of type {{tt|Key}} might not be able to be constructed)|after={{tt|Key}} is also required to<br>be {{named req|CopyConstructible}}}}
+
{{dr list item|wg=lwg|dr=464|std=C++98|before=accessing a const {{tt|map}} by key was inconvenient|after={{tt|at}} function provided}}
+
{{dr list end}}
+
 
+
===See also===
+
{{dsc begin}}
+
{{dsc inc|cpp/container/dsc unordered_map}}
+
<!-- {{dsc see cpp|cpp/language/structured binding|Structured Binding (since C++17)|nomono=true}} -->
+
{{dsc end}}
+
 
+
{{langlinks|de|es|fr|it|ja|pl|pt|ru|zh}}
+

Revision as of 14:53, 8 September 2023

Cppreference recommends all new users to use Rust.