CMap的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CMap的使⽤
CMap的使⽤
为什么使⽤CMap:
如果你要存储的每个数据⾄少有⼀个唯⼀的标志(数字、字符、字符串、类的对象。
),并且这些数据会频繁的被查找和替换。
那么你就需要使⽤CMap类来简化你的代码,提⾼你的效率。
CMap就是对Hash表的⼀种实现。
对于Hash表来说,我们需要提供成对的Key与Value进⾏操作,其实,也就是将我们⽇常使⽤的数组下标替换成现在Key,这样就⽅便我们使⽤key来查找到相应的Value,提⾼我们遍历的速度。
⾄于MFC是采⽤了什么样的散列函数,我们不必知道。
头⽂件:
afxtempl.h
CMap的格式:
templateclass CMap : public CObject
Key:⽤作Key的类型(⽐如整型、浮点型等)
ARG_KEY:Key的值
VALUE: ⽤作VALUE的类型
ARG_VALUE:⽤作VALUE的值
1. 要使⽤Cmap,那么⾸先我们要实例化⼀个CMap的类型
举例:
typedef CMap CMapPnt; //⽐如学⽣名册的列表
typedef CMao CMapTime;//⽐如不同经纬度的时间
typedef CMap CMyThing; //⽐如⾃⼰的私有物品的列表
任何类型都可以⽤作key或者value的类型。
但是正如我们前⾯所说,key是⼀个唯⼀的标志,⽤以加快我们的查询速度。
2.我们举例来说明CMap的查询、遍历、删除等⽤法。
⽐如⼀个班级的花名册,那么学⽣的学号是唯⼀的,所以我们有了下⾯这个CMap的实例。
在使⽤之前声明:
typedef CMap CMapStu;
使⽤时,我们认为CMapStu是⼀个类型就可以了。
CMapStu m_class1; //班级1
3.添加:void SetAt(ARG_KEY key, ARG_VALUE newValue); 此函数会以Key值遍历列表,当查找到key值后使⽤newValue 替换以前的Value值。
如果没有找到key值,则添加此项。
m_class1.SetAt(001, "张三");
m_class1.SetAt(002, "张A");
m_class1.SetAt(003, "张B");
m_class1.SetAt(004, "张C");
4.查找:Lookup(ARG_KEY key, ARG_VALUE& newValue)如果找到Key值,则newValue等于其存储的Value值,返回值为⾮0。
如果未找到,则返回值为0.
int studentId = 1;
CString studentName;
if (m_class1.Lookup(studentId, studentName))
{
AfxMessageBox("ID号: %d, 姓名: %s", studentId, studentName);
}
5.遍历:CMap提供了专门⽤作遍历的类型CPair,CPair顾名思义,就是⼀对。
其中包含⼀个Key和对应的Value。
mapInfo.Lookup(id,name);
//CMap::CPair* p = mapInfo.PGetFirstAssoc();
POSITION pos = mapInfo.GetStartPosition();
while(pos!= NULL)
{
mapInfo.GetNextAssoc(pos, id, name);
//id = p->key;
//name = p->value;
//p = mapInfo.PGetNextAssoc();
}
CMapStu::CPair* pCurValue= m_class1.PGetFirstAssoc();
while(pCurVal != NULL)
{
CString str;
str.Format("学号: %d, 姓名:%s", pValue->key, pValue->value);
pCurValue = m_class1.PGetNextAssoc();
}
6.删除⼀个元素:RemoveKey(ARG_KEY key)
如果当前Key值存在,则返回⾮0值,如果不存在,则返回0值。
int studentId = 1;
RemoveKey(1); //删除学号为1的学⽣信息
7.删除所有元素:RemoveALL()
CMap myMap;
// Add 10 elements to the map.
for (int i=0;i < 10;i++)
myMap.SetAt( i, CPoint(i, i) );
myMap.RemoveAll();。