博客
关于我
C++ map 和 multimap 容器
阅读量:515 次
发布时间:2019-03-07

本文共 2334 字,大约阅读时间需要 7 分钟。

map与multimap容器简介

map和multimap是STL中常用的关联式容器,用于存储键值对。它们在数据结构和操作上与set/multiset类似,但额外提供了键值存储的功能。以下是关于map和multimap的详细说明。

map容器

map是标准的关联式容器,每个键值对由键(key)和值(value)组成。map的特点是键是唯一的,每个键只能出现一次。这使得map非常适合需要快速检索和唯一性保证的场景。

map的特点

  • 键唯一性:map中的键是唯一的,插入重复键会导致失败。
  • 高效操作:map的插入、删除和查找操作都比vector快很多,因为它内部采用了平衡二叉树的红黑树结构。
  • 直接访问:通过[]操作符可以直接获取指定键的值。
  • 默认排序:map默认按键顺序存储,键的比较使用less函数。如果需要倒序存储,可以使用greater作为比较器。
  • 迭代器支持:map提供五种迭代器(begin、end、rbegin、rend),可以用来遍历容器中的元素。
  • map的构造

    map的构造有两种方式:无参构造和带参构造。

    • 无参构造map<int, string> m1; 会创建一个默认排序的map。
    • 带参构造:可以通过两个迭代器或者另一个map来构造。例如:
      map
      m5(m1.begin(), m1.end());map
      m6(m3);

    可以通过拷贝构造函数或赋值构造函数来初始化map。

    multimap容器

    multimap与map的主要区别在于键的唯一性。multimap允许相同的键出现多次,这使其在存储多个相同键值对时非常有用。

    multimap的特点

  • 键可重复:同一个键可以出现多次。
  • 操作方式:与map类似,但不支持直接通过[]操作符获取值。
  • 默认排序:multimap默认按键顺序存储,键的比较同样使用less函数。
  • 迭代器支持:multimap也提供五种迭代器,用于元素的遍历。
  • map和multimap的区别对比

    特性 map multimap
    键唯一性 唯一(每个键只能出现一次) 可重复(允许多个相同键)
    []操作符支持 支持(直接获取值) 不支持
    元素个数获取 1(如果键存在)或0(如果键不存在) 可能大于1(如果键存在多次)
    适用场景 存储唯一的键值对 存储多个相同的键值对

    map和multimap的操作

    1. 插入操作

    可以通过以下方式插入元素到map或multimap中:

    • 构造pair对象

      m.insert(std::make_pair(1, "张三"));

      如果键已经存在,插入失败。

    • 使用value_type

      m.insert(map
      ::value_type(2, "李四"));

      value_type是pair<int, string>,可以直接构造键值对。

    • 直接使用[]操作符

      m[4] = "赵六";m[4] = "韩七"; // 覆盖操作

      如果键不存在,插入并初始化值为默认;如果键存在,直接覆盖值。

    2. 迭代操作

    通过迭代器可以遍历map或multimap中的元素:

    • 返回第一个元素
      auto it = m.begin();
    • 返回最后一个元素
      auto it = m.end();
    • 逆向迭代
      auto r_it = m.rbegin();auto rend = m.rend();
    • 遍历示例
      for (auto it = m.begin(); it != m.end(); ++it) {    cout << "key: " << it->first << " value: " << it->second << endl;}

    3. 排序与交换

    map和multimap默认以键的顺序存储,可以通过指定比较器来改变排序方式:

    • 默认排序
      map
      m1;
    • 倒序排序
      map
    > m2;
  • 交换容器
    m3.swap(m2); // 交换m3和m2的元素
  • 4. 容器操作

    • 删除元素
      m.erase(m.begin());m.erase(beg, end);m.erase(key); // 删除指定键的对组
    • 删除所有元素
      m.clear();
    • 获取元素个数
      m.size();
    • 判断是否为空
      m.empty();

    5. 查找操作

    • 查找键是否存在
      auto it = m.find(key);if (it != m.end()) {    // 存在键,获取对应的值} else {    // 键不存在}
    • multimap的查找
      auto mit = m2.find(key);if (mit != m2.end()) {    // 查找多个键值对}
    • 获取键值对个数
      m.count(key);
    • 查找范围
      auto lower = m.lower_bound(key);auto upper = m.upper_bound(key);auto range = m.equal_range(key);

      equal_range 返回的是一个pair<iterator, iterator>,分别表示范围的起始和结束。

    总结

    map和multimap是STL中非常实用的容器。map适合存储唯一的键值对,而multimap适合存储多个相同的键值对。无论是map还是multimap,它们都支持高效的插入、删除、查找操作,并提供丰富的迭代器功能。通过合理选择比较器和操作方式,可以实现各种复杂的数据管理需求。

    转载地址:http://hrpjz.baihongyu.com/

    你可能感兴趣的文章
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>