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

为此,我在网上找到资料,用映射表类CMap的操作符[]来进行去重,代码如下。

void ReplicateData(CStringArray* inputData,CStringArray* outputData,int &size){    CMap<CString , LPCTSTR , bool, bool &>    StrMap;    for ( int i = 0; i < size; i ++ )    {        StrMap[inputData->GetAt(i)] = true;//操作符[]是在映射中插入一个元素,它是代替SetAt的操作符    }    POSITION pos = StrMap.GetStartPosition();    int i = 0;    while ( pos )    {        bool value;        CString key;        StrMap.GetNextAssoc( pos, key, value );        outputData->Add(key);        i ++;    }    size = i;}

下面先介绍一下映射表类(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添加到输出数组中,遍历完整个表之后,就能获得没有重复数据的输出数组。