博客
关于我
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访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡和反相代理的配置
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    nginx转发端口时与导致websocket不生效
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置Https证书
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>