命名空间
变体
操作

std::map

来自 cppreference.com
< cpp‎ | 容器
 
 
 
 
定义在头文件 <map>
template<

    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T>>

> class map;
(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>>>;

}
(2) (自 C++17 起)

std::map 是一个排序的关联式容器,包含具有唯一键的键值对。键使用比较函数 Compare 进行排序。搜索、删除和插入操作具有对数复杂度。映射通常用 红黑树 实现。

std::map 的迭代器按键的升序进行迭代,其中升序由用于构造的比较定义。也就是说,给定

  • m,一个 std::map
  • it_lit_r,对 m 可解引用迭代器,其中 it_l < it_r.

m.value_comp()(*it_l, *it_r) == true(如果使用默认比较,则从最小到最大)。

在标准库中使用 Compare 需求的任何地方,唯一性都是使用等价关系确定的。用不精确的术语来说,两个对象 ab 被认为是等价的(不是唯一的),如果它们都不比另一个小: !comp(a, b) && !comp(b, a).

std::map 满足 ContainerAllocatorAwareContainerAssociativeContainerReversibleContainer 的需求。

内容

[编辑] 模板参数

[编辑] 成员类型

成员类型 定义
key_type Key[编辑]
mapped_type T[编辑]
value_type std::pair<const Key, T>[编辑]
size_type 无符号整型(通常是 std::size_t)[编辑]
difference_type 有符号整型(通常是 std::ptrdiff_t)[编辑]
key_compare Compare[编辑]
allocator_type Allocator[编辑]
reference value_type&[编辑]
const_reference const value_type&[编辑]
pointer

Allocator::pointer

(直到 C++11)

std::allocator_traits<Allocator>::pointer

(自 C++11 起)
[编辑]
const_pointer

Allocator::const_pointer

(直到 C++11)

std::allocator_traits<Allocator>::const_pointer

(自 C++11 起)
[编辑]
iterator LegacyBidirectionalIteratorvalue_type[编辑]
const_iterator LegacyBidirectionalIteratorconst value_type[编辑]
反向迭代器 std::reverse_iterator<iterator>[编辑]
常量反向迭代器 std::reverse_iterator<const_iterator>[编辑]
node_type (自 C++17 起) 一个 节点句柄 的特化,表示一个容器节点[编辑]
insert_return_type (自 C++17 起) 描述插入 node_type 结果的类型,一个

template<class Iter, class NodeType>
struct /*未指定*/
{
    Iter     position;
    bool     inserted;
    NodeType node;
};

使用模板参数 iteratornode_type 实例化的结构体。[编辑]

[编辑] 成员类

比较 value_type 类型的对象
(类) [编辑]

[编辑] 成员函数

构造 map
(公共成员函数) [编辑]
析构 map
(公共成员函数) [编辑]
将值赋值给容器
(公共成员函数) [编辑]
返回关联的分配器
(公共成员函数) [编辑]
元素访问
使用边界检查访问指定元素
(公共成员函数) [编辑]
访问或插入指定元素
(公共成员函数) [编辑]
迭代器
返回指向开头的迭代器
(公共成员函数) [编辑]
(C++11)
返回指向结尾的迭代器
(公共成员函数) [编辑]
返回指向开头的反向迭代器
(公共成员函数) [编辑]
(C++11)
返回指向结尾的反向迭代器
(公共成员函数) [编辑]
容量
检查容器是否为空
(公共成员函数) [编辑]
返回元素数量
(公共成员函数) [编辑]
返回可能的最大元素数量
(公共成员函数) [编辑]
修改器
清除内容
(公共成员函数) [编辑]
插入元素 或节点(自 C++17 起)
(公共成员函数) [编辑]
插入一系列元素
(公共成员函数) [编辑]
如果键已存在,则插入元素或将值赋给当前元素
(公共成员函数) [编辑]
(C++11)
在原地构造元素
(公共成员函数) [编辑]
使用提示在原地构造元素
(公共成员函数) [编辑]
如果键不存在,则在原地插入,如果键存在,则不执行任何操作
(公共成员函数) [编辑]
擦除元素
(公共成员函数) [编辑]
交换内容
(公共成员函数) [编辑]
(C++17)
从容器中提取节点
(公共成员函数) [编辑]
(C++17)
从另一个容器中拼接节点
(公共成员函数) [编辑]
查找
返回与特定键匹配的元素数量
(公共成员函数) [编辑]
查找具有特定键的元素
(公共成员函数) [编辑]
(C++20)
检查容器是否包含具有特定键的元素
(公共成员函数) [编辑]
返回与特定键匹配的元素范围
(公共成员函数) [编辑]
返回指向第一个不小于给定键的元素的迭代器
(公共成员函数) [编辑]
返回指向第一个大于给定键的元素的迭代器
(公共成员函数) [编辑]
观察者
返回比较键的函数
(公共成员函数) [编辑]
返回比较 value_type 类型对象中的键的函数
(公共成员函数) [编辑]

[编辑] 非成员函数

(已在 C++20 中移除)(已在 C++20 中移除)(已在 C++20 中移除)(已在 C++20 中移除)(已在 C++20 中移除)(C++20)
按字典顺序比较两个 map 的值
(函数模板) [编辑]
特化 std::swap 算法
(函数模板) [编辑]
删除所有满足特定条件的元素
(函数模板) [编辑]

推导指南

(自 C++17 起)

[编辑] 注释

功能测试 标准库 功能
__cpp_lib_containers_ranges 202202L (C++23) 容器的范围构造和插入

[编辑] 示例

#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';
}

输出

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

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用到之前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 230 C++98 Key 不需要是 可复制构造
(类型为 Key 的键可能无法构造)
Key 还需要
可复制构造
LWG 464 C++98 通过键访问 const map 不方便 提供 at 函数

[编辑] 另请参见

按键排序的键值对集合
(类模板) [编辑]
按键哈希的键值对集合,键是唯一的
(类模板) [编辑]
适配两个容器以提供按唯一键排序的键值对集合
(类模板) [编辑]