有时候我们想把用户自定义类型作为std::map的键值。
方法一)最简单的方法就是实现该自定义类型的<操作符,代码如下:
class Foo
{
public:
    Foo(int num_)
        : num(num_)
    {
    }
    bool operator < (const Foo & cmp) const
    {
        return num < cmp.num;
    }  
    int num;   
};
之后就可以使用Foo作为map的key了:
map<Foo, int> dict; // 该句等同于map<Foo, int, std::less<Foo> > dict;
dict[Foo(1)] = 1;
不过有时候,这招不好使,比如对下面的Foo2:
typedef std::pair<Foo, int> Foo2;
方法二)定义一个比较操作符,使用它作为map的模板参数,代码如下:
class Foo2Comparator
{
public:
    bool operator()(const Foo2& key1, const Foo2& key2) const
    {
        if (key1.first < key2.first)
        {
            return true;
        }
        else if (key2.first < key1.first)
        {
            return false;
        }
        else
        {
            return key1.second < key2.second;
        }
    }
};
这时候可以使用Foo2作为map的key了:
map<Foo2, int, Foo2Comparator> dict2;
dict2[Foo2(Foo(1), 100)] = 1;
方法三)为用户自定义类型特化std::less,代码如下:
namespace std
{
template <>
struct less<Foo2>
    : public binary_function <Foo2, Foo2, bool>
{
    bool operator()(const Foo2& key1, const Foo2& key2) const
    {
        if (key1.first < key2.first)
        {
            return true;
        }
        else if (key2.first < key1.first)
        {
            return false;
        }
        else
        {
            return key1.second < key2.second;
        }
    }
};
}
使用这种方法,声明map时无需指定比较函数对象,因为默认的比较对象就是std::less<T>,
map<Foo2, int> dict2;
dict2[Foo2(Foo(1), 100)] = 3;
======================================================
三种方法里面我最喜欢第二种,虽然使用起来略微复杂(多了一个模板参数),但最为明确清晰。
另外如果使用std::pair<T1, T2>作为map的key,若T1、T2是原始类型,那么使用默认的std::less<std::pair<T1, T2> >一般就ok了,没啥必要去自己折腾。
typedef std::pair<double, int> Pos;
std::map<Pos, int> dict3;
dict3[Pos(1.1, 10)] = 100;

使用用户自定义类型作为map的key相关推荐

  1. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)

    Spring 注入(Injection) 什么是注入? 为什么要注入? 如何进行注入[开发步骤] Spring注入的原理分析(简易版) Set注入详解 JDK内置类型 String+8种基本类型 数组 ...

  2. Go 学习笔记(12)— 字典map定义、初始化、读取字典、删除字典、清空字典、map 按 key 进行有序遍历

    Go 中字典也叫做 map , map 是一种无序的键值对的集合. map 最重要的一点是通过 key 来快速检索数据, key 类似于索引,指向数据的值. 1. 字典定义 可以使用内建函数 make ...

  3. java map byte[],java中byte数组不能作为map的key使用

    今天在使用java写代码的时候,用byte数组作为map的key来使用,发现在遍历的时候get到之前传进去的值总是为空,很是困惑,后来查了下资料发现java中的字节数组不能直接作为map的key来使用 ...

  4. c++ map 获取key列表_好未来Golang源码系列一:Map实现原理分析

    分享老师:学而思网校 郭雨田 一.map的结构与设计原理 golang中map是一个kv对集合.底层使用hash table,用链表来解决冲突 ,出现冲突时,不是每一个key都申请一个结构通过链表串起 ...

  5. Java中Object转Map类型,Map转Object类型

    前言 在使用Java编程过程中,经常会遇到获取的数据为Object类型,但只是以这种方式传输,实质还是Map类型,此时就涉及到两种类型的相互转换. 强制转换 在类型转换工程中,常见的转换方式为强制转换 ...

  6. mysql2个字段还会map_通过注解实现MyBatis将sql查询结果的两个字段分别作为map的key,value...

    package com.lsz.config.enums; import java.lang.annotation.*; /** * 将查询结果映射成map的注解,其中第一个字段为key,第二个字段为 ...

  7. 判断map的key的value是否为空

    1.判断map里的一个key的value是否为空.(根据评论改进了一下.有比我写的好的方法可以写在评论写,相互交流) @Testpublic void ceshimap(){HashMap<St ...

  8. MySQL.MyBatis怎么将查询的两个字段作为Map的key和value

    MySQL.MyBatis怎么将查询的两个字段作为Map的key和value 问题的由来 前端使用Echarts图标显示汇总数据.需要形式如下的数据: {"C20": 42.01, ...

  9. 6.3 Kotlin集合类型之Map、MutableMap

    Kotlin集合类型之Map.MutableMap Map 声明和创建Map集合 Map常用函数 Kotlin MutableMap 声明和创建MutableMap MutableMap常用函数 Ha ...

最新文章

  1. 安卓读取mysql数据库文件路径_Android开发实现读取assets目录下db文件的方法示例...
  2. Python排序dict之list数组
  3. #pragma pack(1)的作用
  4. Qt学习笔记之网络和连接
  5. imx6 休眠 功耗 电流_无线物联网和可穿戴设备的低功耗电源测量挑战
  6. python 日志模块 日志格式
  7. docker和数据卷问题探究
  8. [考试反思]0813NOIP模拟测试20
  9. MD5,SHA-1,SHA-256摘要加解密
  10. Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
  11. c#获取屏幕上某坐标点的颜色
  12. [论文翻译]Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
  13. SHFileOperation的用法
  14. 查看360极速浏览器保存的密码
  15. java 生成word 分页_Java 插入分页符和分节符到Word文档
  16. 三年高级开发,六年成为架构师,到CTO我用了12年
  17. RGB565和RGB888的转换
  18. 应用系统报错:com.highgo.jdbc.util.PSQLException:bad value for long
  19. sql数据库习题总集
  20. 计算机专业考研 数学分析,中国农业大学2018年计算机考研816数学分析考试大纲...

热门文章

  1. 【Python】编程笔记10
  2. Flutter Web实战项目打造真正跨平台应用(windows,android,ios,linux,macos,web)
  3. Flutter中Row中的子控件左右两端对齐
  4. Git之常见的分支操作
  5. java lazy loading_java – Spring,@Transactional和Hibernate Lazy Loading
  6. 贴花纸怎么贴_木纹纸怎么贴? 贴木纹纸的方法与详细步骤
  7. 直播回顾丨神策数据王朋:如何搭建一套高可用的前端异常监控系统?
  8. 走出迷茫和怀疑,迎接在神策冒险的新时代
  9. 神策数据张涛:如何让用户标签价值落地?
  10. oracle10g只导出某个用户所拥有的数据库表