MFC中容器类的使用

对于MFC中所提到的基本容器类,做一个基本的介绍和编程操作。

  如有数据结构基础,可以直接看第四部分对容器类的操作。

  第一,MFC提供三种基本的容器类:arrays(数组), lists(链表), maps(映射,也称作字典).

  第二,各容器类的特征分类

类型 排序? 索引? 插入元素 查找特定元素 重复的元素?
List Yes No Fast Slow Yes
Array Yes By int Slow Slow Yes
Map No By key Fast Fast No (keys)
Yes (values)

  第三,模板容器类和非模板容器类

  模板容器类:

Collection contents Arrays Lists Maps
任意对象类型的容器 CArray CList CMap
任意对象指针类型的容器 CTypedPtrArray CTypedPtrList CTypedPtrMap

  非模板容器类:

Arrays Lists Maps
CObArray CObList CMapPtrToWord
CByteArray CPtrList CMapPtrToPtr
CDWordArray CStringList CMapStringToOb
CPtrArray   CMapStringToPtr
CStringArray   CMapStringToString
CWordArray   CMapWordToOb
CUIntArray   CMapWordToPtr

  第四,模板容器类的使用

  1,简单的容器类的使用  CArray, CList, CMap

    1.1 CArray的使用

      基本数据类型 ,如int, char, and float

      CArray myArray;
      结构体或者类

      CArray myArray;

    1.2 CList的使用

      基本数据类型 ,如int, char, and float

      CList myList;
      结构体或者类

      CList myList;

    1.3 CMap的使用 

      CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;

      CMap< CString, LPCSTR, CPerson, CPerson& > myMap2;

    

//map映射表
CMap<<FONT face="Courier New">int, int, CPoint, CPoint> myMap; 

//初始化哈希表,并指定其大小(数字为120%容量,最好取奇数)
myMap.InitHashTable(13);

//添加元数据 
for (i=0; i<<SPAN style="COLOR: #800080">10; i++)
{ 
	myMap.SetAt(i, CPoint(i,i*i));
} 

//遍历一次
POSITION pos = myMap.GetStartPosition(); 
while(pos != NULL) 
{ 
	CPoint pt; myMap.GetNextAssoc(pos, i, pt);
}

//查找特定元素 
pos = myMap.GetStartPosition(); 
while(pos != NULL)
{
	CPoint pt; myMap.GetNextAssoc(pos, i, pt); 
	if (i == 3)
	{ 
		CString str;
		str.Format(_T("x:%d y:%d"), pt.x, pt.y);
		MessageBox(str); 
	} 
}

//删除数据 
myMap.RemoveAll();



  2, 指针类型的容器类的使用 CTypedPtrArray, CTypedPtrList, CTypedPtrMap

    2.1 CTypedPtrArray的使用

      CTypedPtrArray   

        //BASE_CLASS:为 CObArray or CPtrArray

      CTypedPtrArray myArray;

    2.2 CTypedPtrList的使用

      CTypedPtrList    

        //BASE_CLASS: 为  CObList or CPtrList

      CTypedPtrList myList;

    2.3 CTypedPtrMap的使用

      CTypedPtrMap 

        //BASE_CLASS: 为CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb 

     CTypedPtrMap myPtrMap;
     CTypedPtrMap myObjectMap;
<think>好的,我现在需要帮助用户找到关于MFC中map容器使用示例代码。用户之前已经询问过`map<CString, CString>::iterator`的含义,现在他们想看到具体的案例。首先,我得回忆一下MFC中的map容器,常见的有CMap,但用户也可能指的是STL的std::map与MFC的CString结合使用的情况。根据用户提供的引用,特别是引用[2]里提到了CMap和Position Map的原理,所以可能需要涵盖这两种情况。 首先,用户需要示例代码,应该包括CMap和STL map的使用方法。引用[2]中提到CMap使用POSITION进行遍历,而STL的map则用迭代器。另外,用户之前的回答中提到了STL的map和MFC的CString结合,所以需要展示如何将CString作为键和值。 接下来,我需要确定用户可能需要的操作,比如插入、查找、遍历、删除。根据引用[2],这些是Map的典型操作,所以每个示例都应该包括这些操作。同时,引用[4]中的代码片段可能涉及到UI控件与map的结合,但用户的问题更偏向于基础使用,所以可能不需要界面部分,但如果有简单的应用场景会更好。 需要注意的是,用户引用的资料里提到了MFC的CMap,以及STL的map,因此要区分两者的示例。例如,CMap使用POSITION,而STL map使用迭代器。同时,字符编码的问题在MFC中很重要,特别是CString和std::string之间的转换,可能需要包含相关代码。 另外,用户之前的回答提到了性能优化,比如预分配空间和避免频繁查找,所以在示例中可以适当加入这些建议。例如,在CMap中可能需要初始化哈希表大小,或者在使用STL时使用reserve方法。 可能还需要对比CMap和std::map的不同,如引用[2]中提到的数据结构(红黑树 vs 哈希表),以及各自的优缺点。不过用户主要需要示例,所以这部分可能放在注意事项里简要说明。 最后,确保代码示例正确,特别是CString的处理,以及MFC特有的宏和函数,如AfxMessageBox,或者字符转换宏如CT2CA。同时,错误处理也很重要,比如查找元素是否存在再操作,避免崩溃。 总结步骤: 1. 分别展示MFC的CMap和STL的map使用示例。 2. 包括插入、遍历、查找、删除操作。 3. 处理CString与字符串的转换。 4. 提供注意事项,如性能优化和选择容器的建议。 5. 添加相关问题,帮助用户深入理解。</think>### MFC中Map容器使用示例代码(CMap与std::map对比实现) --- #### 一、**MFC原生CMap使用示例** ```cpp #include <afxtempl.h> // CMap所需头文件 // 1. 定义CMap容器(键:CString,值:int) CMap<CString, LPCTSTR, int, int> mapMFC; // 2. 插入元素 mapMFC.SetAt(_T("数学"), 90); mapMFC.SetAt(_T("语文"), 85); // 3. 遍历元素(POSITION方式) POSITION pos = mapMFC.GetStartPosition(); CString strKey; int nValue; while (pos != NULL) { mapMFC.GetNextAssoc(pos, strKey, nValue); CString strMsg; strMsg.Format(_T("科目:%s -> 分数:%d"), strKey, nValue); AfxMessageBox(strMsg); } // 4. 查找元素 int nFindScore; if (mapMFC.Lookup(_T("数学"), nFindScore)) { AfxMessageBox(_T("找到数学成绩")); } // 5. 删除元素 mapMFC.RemoveKey(_T("语文")); ``` --- #### 二、**STL std::map与MFC结合示例** ```cpp #include <map> // STL map所需头文件 // 1. 定义std::map容器(键值均为CString) std::map<CString, CString> mapSTL; // 2. 插入元素 mapSTL[_T("张三")] = _T("工程师"); mapSTL.insert({ _T("李四"), _T("设计师") }); // 3. 遍历元素(迭代器方式) for (auto it = mapSTL.begin(); it != mapSTL.end(); ++it) { CString strMsg; strMsg.Format(_T("姓名:%s -> 职位:%s"), it->first, it->second); AfxMessageBox(strMsg); } // 4. 查找元素(需转换为std::string兼容查找) auto iter = mapSTL.find(_T("张三")); if (iter != mapSTL.end()) { AfxMessageBox(_T("找到张三的职位")); } // 5. 删除元素 mapSTL.erase(_T("李四")); ``` --- ### 关键差异说明 | 特性 | CMap (MFC) | std::map (STL) | |---------------------|---------------------|----------------------| | **底层结构** | 哈希表 | 红黑树 | | **遍历方式** | POSITION定位 | 迭代器 | | **查找效率** | O(1) 平均 | O(log n) 稳定 | | **内存管理** | 需手动清理 | 自动析构 | | **MFC兼容性** | 原生支持CString | 需注意编码转换 | --- ### 应用场景建议 1. **CMap适用场景** - 需要快速插入/删除的键值对集合 - MFC项目要求最小化STL依赖时 - 处理非排序需求的哈希表结构 2. **std::map适用场景** - 需要按键自动排序的场合 - 跨平台代码开发 - 需要标准算法库支持(如std::find_if) --- ### 注意事项 1. **字符编码处理** STL容器若需与CString交互,使用转换宏: ```cpp std::string strStd = CT2CA(cstrMFC.GetString()); // CString转std::string CString cstrMFC = CA2T(strStd.c_str()); // std::string转CString ``` 2. **性能优化技巧** - CMap初始化时设置合理哈希桶大小: ```cpp mapMFC.InitHashTable(257); // 质数减少哈希冲突 ``` - std::map可预分配内存(通过自定义分配器) --- ### 相关问题 1. CMap如何解决哈希冲突? 2. 如何为CMap自定义哈希函数? 3. std::map如何实现按值反向排序? 4. MFC中如何将CMap数据序列化到文件?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值