std::map 自定义类型为key,需重载小于运算符

虽然这个问题从学C++就知道,但最近面试的时候,面试官问如果map要使用自定义类型作为key行不行。
我一想他肯定是要问我实现operator <的问题,然后我说了一个不一定哦~ 不必要哦~
特此记录一下。

一般来说当申明map对象的时候,需要传入支持绝对小于运算的类型作为key:

#include <iostream>
#include <map>

struct Key {
  int a;
  int b;

  explicit Key(int x, int y) : a(x), b(y) {}

  bool operator<(const Key& other) const {
    if (other.a >= a) {
      return true;
    }

    if (other.a < a and other.b >= b) {
      return true;
    }

    return false;
  }
};

std::ostream& operator<<(std::ostream& os, const Key& self) {
  os << "{" << self.a << ", " << self.b << "}";
  return os;
}

int main() {
  std::map<Key, int, Less> mp{{Key(3, 4), 233}};
  mp.insert({Key(1, 2), 111});

  for (auto&& i : mp) {
    const auto [a, b] = i;
    std::cout << a << "->" << b << std::endl;
  }
}
{1, 2}->111
{3, 4}->233

我们都知道map在插入,删除,查找时会按照二叉树规律去比较节点的key值,默认会使用Key类型提供的<去标胶对象大小。如果在构造时没有传入第三参数比较运算对象,就调用该对象提供的仿函数替换原有<,或者如果没有重载<将使用该对象。gnu C++ 源码:

 template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
	    typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
    class map
    { ... };

而有一次我在构造map对象的时候传入了比较运算对象

struct Key {
  int a;
  int b;
  
  explicit Key(int x, int y) : a(x), b(y) {}
};

struct Less {
  // std::map采用此规则,变成了从大到小排
  auto operator()(const Key& x, const Key& y) {
    if (x.a >= y.a) {
      return true;
    }

    if (x.a < y.a and x.b >= y.b) {
      return true;
    }

    return false;
  }
};

{
  std::map<Key, int, Less> mp{{Key(3, 4), 233}}; // 使用Less作为第三参数实例化模板
  mp.insert({Key(1, 2), 111});
}
{3, 4}->233
{1, 2}->111
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歪锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值