ToB企服应用市场:ToB评测及商务社交产业平台

标题: [MFC]过滤数组中重复的数据 [打印本页]

作者: 乌市泽哥    时间: 2023-12-12 09:58
标题: [MFC]过滤数组中重复的数据
之前在帮客户开发一个自动读取物理网卡地址功能的时候,获取到的网卡地址偶尔会出现重复,如下图,无论是单张网卡还是多张网卡都存在这个问题。由于我获取的网卡地址是存放于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添加到输出数组中,遍历完整个表之后,就能获得没有重复数据的输出数组。

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4