博客
关于我
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中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    node全局对象 文件系统
    查看>>
    Node出错导致运行崩溃的解决方案
    查看>>
    Node响应中文时解决乱码问题
    查看>>
    node基础(二)_模块以及处理乱码问题
    查看>>
    node安装卸载linux,Linux运维知识之linux 卸载安装node npm
    查看>>
    node安装及配置之windows版
    查看>>
    Node实现小爬虫
    查看>>
    Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
    查看>>
    Node提示:npm does not support Node.js v12.16.3
    查看>>
    Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
    查看>>
    Node服务在断开SSH后停止运行解决方案(创建守护进程)
    查看>>
    node模块化
    查看>>
    node模块的本质
    查看>>
    node环境下使用import引入外部文件出错
    查看>>
    node环境:Error listen EADDRINUSE :::3000
    查看>>
    Node的Web应用框架Express的简介与搭建HelloWorld
    查看>>
    Node第一天
    查看>>
    node编译程序内存溢出
    查看>>