[MFC]过滤数组中重复的数据

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

之前在帮客户开发一个自动读取物理网卡地址功能的时候,获取到的网卡地址偶尔会出现重复,如下图,无论是单张网卡还是多张网卡都存在这个问题。由于我获取的网卡地址是存放于CStringArray中,所以我得对其中的数据进行去重才能正常地显示网卡地址。

 为此,我在网上找到资料,用映射表类CMap的操作符[]来进行去重,代码如下。
  1. void ReplicateData(CStringArray* inputData,CStringArray* outputData,int &size)
  2. {
  3.     CMap<CString , LPCTSTR , bool, bool &>    StrMap;
  4.     for ( int i = 0; i < size; i ++ )
  5.     {
  6.         StrMap[inputData->GetAt(i)] = true;//操作符[]是在映射中插入一个元素,它是代替SetAt的操作符
  7.     }
  8.     POSITION pos = StrMap.GetStartPosition();
  9.     int i = 0;
  10.     while ( pos )
  11.     {
  12.         bool value;
  13.         CString key;
  14.         StrMap.GetNextAssoc( pos, key, value );
  15.         outputData->Add(key);
  16.         i ++;
  17.     }
  18.     size = i;
  19. }
复制代码
下面先介绍一下映射表类(CMap),映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”。 类似于c++ STL map或hashmap,构造为CMap,KEY对象的类,用作映射的关键码。ARG_KEY参数KEY使用的数据类型,通常为KEY的参考。VALUE存储在映射中对象的类。ARG_VALUE参数VALUE使用的数据类型,通常为VALUE的参考。它的SetAt函数在映射中插入一个元素,如果发现相匹配的关键码,则替换已经存在的元素。而Operator[]:在映射中插入一个元素,它是代替SetAt的操作符,剩下更多关于映射表类的资料可自行去网上搜寻。
ReplicateData函数的三个参数分别代表输入有重复数据的数组、输出去重后的数组,还有数组的长度的引用。首先,定义一个CMap模板类的对象StrMap,key为CString类型,value则为bool类型。然后建立一个循环,根据输入数组的长度,去给StrMap映射中插入元素,这里简单点全部插入true,在这一步中,根据上面对CMap类的介绍(SetAt函数在映射中插入一个元素,如果发现相匹配的关键码,则替换已经存在的元素),StrMap中的key就不存在重复的数据。接下来,用GetStartPosition函数获取表头的位置,然后,我们可以使用GetNextAssoc函数来遍历,把key添加到输出数组中,遍历完整个表之后,就能获得没有重复数据的输出数组。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表