关于map的定义:

template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class map;

第一个template参数被当做元素的key,第二个template参数被当作元素的value。Map的元素型别Key和T,必须满足以下两个条件:
1.key/value必须具备assignable(可赋值的)和copyable(可复制的)性质。
2.对排序准则而言,key必须是comparable(可比较的)。
第三个template参数可有可无,用它来定义排序准则。这个排序准则必须定义为strict weak ordering。元素的次序由它们的key决定,和value无关。排序准则也可以用来检查相等性:如果两个元素的key彼此的都不小于对方,则两个元素被视为相等。如果使用未传入特定排序准则,就使用缺省的less排序准则——以operator<来进行比较。

所谓“排序准则”,必须定义strict weak ordering,其意义如下:
1.必须是“反对称性的”。
2.必须是“可传递的”。
3.必须是“非自反的”。

按照定义的要求:
我们有两种方法以自定义类型当key:
1.为自定义类型重载operator<,map的第三个参数为默认仿函数less<key>。

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. using namespace std;
  5. class test
  6. {
  7. public:
  8. bool operator<(const test& a)const;
  9. //private:
  10. int nA;
  11. int nB;
  12. };
  13. bool test::operator<(const test& a)const
  14. {
  15. if(this->nA < a.nA)
  16. return true;
  17. else
  18. {
  19. if(this->nA == a.nA && this->nB < a.nB)
  20. return true;
  21. else
  22. return false;
  23. }
  24. }
  25. int main()
  26. {
  27. map<test, string> myTestDemo;
  28. test tA;
  29. tA.nA = 1;
  30. tA.nB = 1;
  31. test tB;
  32. tB.nA = 1;
  33. tB.nB = 2;
  34. myTestDemo.insert(pair<test, string>(tA, "first!"));
  35. myTestDemo.insert(pair<test, string>(tB, "second!"));
  36. map<test, string>::iterator myItr = myTestDemo.begin();
  37. cout << "itr begin test nA:" << myItr->first.nA << endl;
  38. cout << "itr begin test nB:" << myItr->first.nB << endl;
  39. cout << "itr begin test string:" << myItr->second << endl;
  40. return 1;
  41. }

2. 不使用map的第三个参数为默认仿函数less<key>,自己编写一个比较仿函数。

    1. #include <iostream>
    2. #include <map>
    3. using namespace std;
    4. struct keyOfMap
    5. {
    6. int firstOfKey;
    7. int secondOfKey;
    8. };
    9. struct myMapFunctor
    10. {
    11. bool operator()(const keyOfMap& k1, const keyOfMap& k2) const
    12. {
    13. if(k1.firstOfKey < k2.firstOfKey)
    14. return true;
    15. else
    16. return false;
    17. }
    18. };
    19. int main()
    20. {
    21. map<keyOfMap, string, myMapFunctor> test;
    22. keyOfMap temp1;
    23. keyOfMap temp2;
    24. temp1.firstOfKey = 1;
    25. temp1.secondOfKey = 1;
    26. temp2.firstOfKey = 2;
    27. temp2.secondOfKey = 2;
    28. test.insert(make_pair<keyOfMap, string>(temp1, "first"));
    29. test.insert(make_pair<keyOfMap, string>(temp2, "second"));
    30. map<keyOfMap, string, myMapFunctor>::iterator begin = test.begin();
    31. cout << begin->first.firstOfKey << begin->first.secondOfKey << begin->second << endl;
    32. return 1;

map以自定义类型当Key的更多相关文章

  1. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_7_HashMap存储自定义类型键值

    自定义类型做key值.必须要重写hashCode和equals方法 创建pserson类 有name个age两个成员变量.重写toString方法 key有重复,会被新的value值替换掉. key值 ...

  2. (六)cxf处理一些Map等复杂类型

    前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...

  3. 关于set或map的key使用自定义类型的问题

    我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...

  4. 一个关于自定义类型作为HashMap的key的问题

    在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashM ...

  5. java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)

    由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法, ...

  6. Ⅵ.spring的点点滴滴--自定义类型转换器

    承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...

  7. struts2自定义类型转换器

    首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机 ...

  8. MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

    1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...

  9. Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志

    测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...

随机推荐

  1. MySQL有关1042 Can’t get hostname for your address的问题分析解决过程

    [Comment 1]  前同事企鹅上面说他安装的mysql 5.5,发现用mysql客户端远程连接的时候,报1042-Can’t get hostname for your address错误,但是 ...

  2. Install Identity management Database

    Install Identity management Database         Installing Oracle Fusion Applications > Setting up I ...

  3. (LeetCode 83)Remove Duplicates from Sorted Lists

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  4. 算法(第四版)学习笔记之java实现希尔排序

    希尔排序思想:使数组中随意间隔为h的元素都是有序的. 希尔排序是插入排序的优化.先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码例如以下: /** * * @author seab ...

  5. 如何快速去掉.svn文件夹?

    我们在工程的协作开发过程中,常用的是 svn , 有时我们需要一个干净的 网站版本,没有 .svn 这些文件夹记录的版本传到服务器上使用,自己一个个去文件删除的话也太累了,这时我们就用到以下功能,用c ...

  6. Oracle的REGEXP_SUBSTR函数简单使用方法

    REGEXP_SUBSTR延伸SUBSTR函数的功能.让你搜索一个正則表達式模式字符串. 这也相似于REGEXP_INSTR.而是返回子字符串的位置,它返回的子字符串本身. 语法 Oracle数据库中 ...

  7. [模式识别].(希腊)西奥多里蒂斯&lt;第四版&gt;笔记5之__特征选取

    1,引言 有关模式识别的一个主要问题是维数灾难.我们将在第7章看到维数非常easy变得非常大. 减少维数的必要性有几方面的原因.计算复杂度是一个方面.还有一个有关分类器的泛化性能. 因此,本章的主要任 ...

  8. 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答

    目录 1 马虎的算式 2 黄金连分数 3 有理数类 4 幸运数 5 连号区间数   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 马虎的算式 标题: 马虎的算式 小明 ...

  9. 算法笔记_120:蓝桥杯第六届省赛(Java语言B组部分习题)试题解答

     目录 1 三角形面积 2 立方变自身 3 三羊献瑞 4 九数组分数 5 饮料换购 6 生命之树   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 三角形面积 三角形 ...

  10. Statusbar

    Main window The QtGui.QMainWindow class provides a main application window. This enables to create a ...