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

    你可能感兴趣的文章
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>
    Node.js 之 log4js 完全讲解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 函数计算如何突破启动瓶颈,优化启动速度
    查看>>
    Node.js 切近实战(七) 之Excel在线(文件&文件组)
    查看>>
    node.js 初体验
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    Node.js 模块系统的原理、使用方式和一些常见的应用场景
    查看>>
    Node.js 的事件循环(Event Loop)详解
    查看>>
    node.js 简易聊天室
    查看>>
    Node.js 线程你理解的可能是错的
    查看>>
    Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
    查看>>
    node.js 配置首页打开页面
    查看>>