map以自定义类型当Key
关于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>。
- #include <iostream>
- #include <map>
- #include <string>
- using namespace std;
- class test
- {
- public:
- bool operator<(const test& a)const;
- //private:
- int nA;
- int nB;
- };
- bool test::operator<(const test& a)const
- {
- if(this->nA < a.nA)
- return true;
- else
- {
- if(this->nA == a.nA && this->nB < a.nB)
- return true;
- else
- return false;
- }
- }
- int main()
- {
- map<test, string> myTestDemo;
- test tA;
- tA.nA = 1;
- tA.nB = 1;
- test tB;
- tB.nA = 1;
- tB.nB = 2;
- myTestDemo.insert(pair<test, string>(tA, "first!"));
- myTestDemo.insert(pair<test, string>(tB, "second!"));
- map<test, string>::iterator myItr = myTestDemo.begin();
- cout << "itr begin test nA:" << myItr->first.nA << endl;
- cout << "itr begin test nB:" << myItr->first.nB << endl;
- cout << "itr begin test string:" << myItr->second << endl;
- return 1;
- }
2. 不使用map的第三个参数为默认仿函数less<key>,自己编写一个比较仿函数。
- #include <iostream>
- #include <map>
- using namespace std;
- struct keyOfMap
- {
- int firstOfKey;
- int secondOfKey;
- };
- struct myMapFunctor
- {
- bool operator()(const keyOfMap& k1, const keyOfMap& k2) const
- {
- if(k1.firstOfKey < k2.firstOfKey)
- return true;
- else
- return false;
- }
- };
- int main()
- {
- map<keyOfMap, string, myMapFunctor> test;
- keyOfMap temp1;
- keyOfMap temp2;
- temp1.firstOfKey = 1;
- temp1.secondOfKey = 1;
- temp2.firstOfKey = 2;
- temp2.secondOfKey = 2;
- test.insert(make_pair<keyOfMap, string>(temp1, "first"));
- test.insert(make_pair<keyOfMap, string>(temp2, "second"));
- map<keyOfMap, string, myMapFunctor>::iterator begin = test.begin();
- cout << begin->first.firstOfKey << begin->first.secondOfKey << begin->second << endl;
- return 1;
- }
map以自定义类型当Key的更多相关文章
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_7_HashMap存储自定义类型键值
自定义类型做key值.必须要重写hashCode和equals方法 创建pserson类 有name个age两个成员变量.重写toString方法 key有重复,会被新的value值替换掉. key值 ...
- (六)cxf处理一些Map等复杂类型
前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...
- 关于set或map的key使用自定义类型的问题
我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...
- 一个关于自定义类型作为HashMap的key的问题
在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashM ...
- java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)
由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖. 不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法, ...
- Ⅵ.spring的点点滴滴--自定义类型转换器
承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...
- struts2自定义类型转换器
首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机 ...
- MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现
1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...
- Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志
测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...
随机推荐
- Python 批量修改图片格式和尺寸
公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图 ...
- PHP json_encode转换空数组为对象
问题描述: php返回json格式的数据,当返回数据的为数组,且key为字符串时,json化后将返回jsonObject,但是如果是空数组,有可能返回的就是jsonArray,数据结构不一致导致端解析 ...
- 【HBase】学习笔记
HBASE 1 简介 1.1 官网 1.1.1 http://hbase.apache.org/ 1.1.2 Apache HBase™ is the Hadoop database, a distr ...
- 【转】gcc选项
http://zodiac1111.github.io/blog/config-gcc-warning/
- A Package Manager for Xcode -Xcode模板管理工具Alcatraz使用
一款功能强大的Xcode模板管理工具 一:安装之后的效果图 二:安装 1:先关闭 xcode 2: 打开 terminal 3: 复制粘贴运行如下代码 mkdir -p ~/Library/App ...
- 在Ubuntu下设置默认编辑器
在默认情况下,Ubuntu 系统会为用户预设程序.就拿文本编辑器来说吧,Ubuntu 预设的是 Nano,对某些朋友来说,使用 Vim 可能更得心应手些.那么如何更改这些预设的程序呢? 你可以使用 s ...
- URAL 题目1297. Palindrome(后缀数组+RMQ求最长回文子串)
1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...
- python之函数用法all
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法all #all(iterable) #说明:如果iterable的所有元素不为0.' ...
- sql优化经历(转存+记录)
sql优化经历 补充:看到这么多朋友对sql优化感兴趣,我又重新补充了下文章的内容,将更多关于sql优化的知识分享出来, 喜欢这篇文章的朋友给个赞吧,哈哈,欢迎交流,共同进步. 2015-4-30补充 ...
- LR基础学习_脚本信息函数
Action(){ //脚本信息函数. //lr_whoami:返回Vuser的ID,组名称,场景ID信息./* int id,scid; char *vuser_group; lr ...