博客
关于我
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/

    你可能感兴趣的文章
    Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    Nacos配置中心集群原理及源码分析
    查看>>
    nacos配置自动刷新源码解析
    查看>>
    Nacos集群搭建
    查看>>
    nacos集群搭建
    查看>>
    Navicat for MySQL 查看BLOB字段内容
    查看>>
    Neo4j电影关系图Cypher
    查看>>
    Neo4j的安装与使用
    查看>>
    Neo4j(2):环境搭建
    查看>>
    Neo私链
    查看>>
    nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    Nessus漏洞扫描教程之配置Nessus
    查看>>
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>