那位给我讲讲CMap怎么用阿,我的E文不好,最好有例子。
解决方案 »
- explorer是如何监控文件/目录信息的?
- 怎么将图片流保存成视频文件
- 想用VC写个程序,这个程序可以启动 Secondary Logon 服务,希望大家给个提示,谢谢!!
- 有关OpenGL的问题(OpenGL高手请进)
- Winsock传输VARIANT型数据时如何定义发送和接收端?请给段代码,谢谢!
- 让一个程序或者DLL开机时启动有哪些方法?
- csdn的服务质量太差了
- 放了个背景图片,前面的图无法响应鼠标了
- 我想用PaintLib把BMP转成传真用的TIFF G3的格式, 不知道标志位具体该怎么设置?
- 打开/保存文件的源带码
- 怎样把程序中GDI画的图以矢量图的形式发布到网上
- 如何获得硬盘序列号年?
{
m_Mapx.MoveWindow(rect.left,rect.top,rect.Width(),rect.Height(),TRUE);
m_Mapx.SetGeoSet("test.gst");
}
其它就看你的操作了。
CMap<int, int, CString, CString> 实现的是整数和字符串的映射,比如1->"aaa", 4->"sss", 100->"sadf"
此后就可以使用整数键获得需要的字符串值typedef CMap<int, int, CString, CString> CMapIntToString;
CMapIntToString map;
(1)初始化:map.SetAt(1, "aaa"); map.SetAt(4,"sss");map.SetAt(100,"sadf");
(2)查找:
int i = 4;
CString str;
if(map.Lookup(i, str)) //键值映射存在
{
ASSERT(str == "sss");
}
else
{
//键值映射不存在
}
(3)遍历:
POSITION pos = map.GetStartPosition();
while(pos != NULL)
{
int i;
CString str;
map.GetNextAssoc(pos, i, str);
TRACE("Map %d=>%s\n", i, str);
}
}
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap
KEY 对象的类,用作映射的关键码
ARG_KEY 参数KEY使用的数据类型,通常为KEY的参考
VALUE 存储在映射中对象的类
ARG_VALUE 参数VALUE使用的数据类型,通常为VALUE的参考
操作符:
Lookup 查找MAP中的某个元素
SetAt 将某个元素设定到指定的位置
RemoveKey 通过Key移除某个在Map中的元素
RemoveAll 移除全部在Map中的元素
GetStartPosition 得到第一个元素在Map中的位置
GetNextAssoc 得到下一个元素在Map中的位置
GetHashTableSize 得到MAP的大小
InitHashTable 初始设定Map的大小
状态:
GetCount 返回MAP中元素的个数
IsEmpty 检查是否MAP中无元素MSDN中CMAP的一个实例:
// 定义一个map类型,key为int型,map中元素类型为CPoint类
CMap<int,int,CPoint,CPoint> myMap; // 加10个item到map中.
for (int i=0;i < 10;i++)
myMap.SetAt( i, CPoint(i, i) ); // 遍历Map,将key为偶数的从map中移除
POSITION pos = myMap.GetStartPosition();
int nKey;
CPoint pt;
while (pos != NULL)
{
myMap.GetNextAssoc( pos, nKey, pt ); if ((nKey%2) == 0)
myMap.RemoveKey( nKey );
}
CString Key;
CString Book;
CMapStringToString Map;//初始化链表
Key="First";
Book="it is the first Key!";
Map.SetAt(Key,Book);
Key="Second";
Book="it is the Second Key!";
Map.SetAt(Key,Book);
//查找链表的值
CString tmp_key;
CString tmp_book;
tmp_key="Second";
Map.Lookup(tmp_key,tmp_book);
AfxMessageBox(tmp_book);
//对话框显示it it the Second Key!
CMap的操作如下:
CMap 构造一个关键字和元素值映射的集合类。
操作:
Lookup 通过给定的关键字查找相应的元素值。
SetAt 向Map中插入一个元素单元;若存在匹配键字,则替代之。
operator [] 向Map中插入一个元素 -SetAt的子操作
RemoveKey 移除由关键字标示的元素单元
RemoveAll 移除Map中的所有元素单元
GetStartPosition 返回第一个元素单元的位置
GetNextAssoc 读取下一个元素单元
GetHashTableSize 返回哈希表的大小(元素单元的数目)
InitHashTable 初始化哈希表,并指定它的大小
GetCount 返回Map中元素的数目
IsEmpty 检查Map是否为空(无元素单元)
看看这本书你就明白了,有中文版
模板我不太懂。
KEY是hash表中的关键字类型,而ARG_KEY是可以用来对存放对关键字的变量赋值时可能要用到的copy 构造函数调用的参数类型,int型不是太看的出来,比如
class A
{ A(A& a) //拷贝构造函数,用于对A类型的变量赋值,注意参数类型A&
{
x = a.x;
y = a.y;
}
private:
long x;
long y;
}当你想用A类的值作为hash表的关键字的时候,KEY 和 ARG_KEY 就得用 A 和 A&。
同样VALUE和ARG_VALUE也是一样。
因此如果你想用某个类作为关键字或值建立一个CMap,则必须保证该类有拷贝构造函数。
好像cstring也行的吧,我用cstring写了一个
CMap<CString, LPCTSTR,CustomizeGroupStruct, CustomizeGroupStruct&> Map;
GroupStruct是我自己写的一个结构
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap
KEY 对象的类,用作映射的关键码
ARG_KEY 参数KEY使用的数据类型,通常为KEY的参考
VALUE 存储在映射中对象的类
ARG_VALUE 参数VALUE使用的数据类型,通常为VALUE的参考关于ARG_KEY的进一步说明;
1.ARG_KEY可以是和KEY相同,即 KEY
2.ARG_KEY可以是KEY的引用,即 KEY&
3.ARG_KEY可以是能够自动转换成 KEY类型的其他对象比如,如果KEY是CString,ARG_KEY可以是
CString,CString&,LPCTSTR
例子
假设有一个学生到老师的对应关系:
deftype CMap<CString,LPCTSTR,CString,CString&> CMyMap;
CMyMap name2teacher;
意思是:
(1)这个CMap中存放的一对数据是CString(同学姓名)和Ctring(老师姓名)
(2)在进行函数操作的时候,涉及到的
同学姓名应该用LPCTSTR(字符串)做参数
老师姓名应该用CString&(引用)做参数
(3)使用LoopUp查找"ZhangSan"的老师的名字,应该
CString teather;
BOOL bOK=LoopUp("ZhangSan",teather);
if(bOK)
{
cout<<"ZhangSan's teather is"<<teather<<endl;
}
//注:原形
//BOOL Lookup( ARG_KEY key, VALUE& rValue );