利用stl的集合类函数 操作mfc数组

网友投稿 680 2022-10-29

利用stl的集合类函数 操作mfc数组

利用stl的集合类函数 操作mfc数组

#include #include "afxtempl.h" //TYPE类必须有< template void Sort(CArray& dest) { std::sort(dest.GetData(),dest.GetData()+dest.GetSize()); } //构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。 //src1,src2必须已排序 template void SetDifference(CArray& dest,const CArray& src1,const CArray& src2) { dest.SetSize(src1.GetSize()); const TYPE* p = std::set_difference(src1.GetData(),src1.GetData()+src1.GetSize(), src2.GetData(),src2.GetData()+src2.GetSize(), dest.GetData()); dest.SetSize(p-dest.GetData()); }; //构造一个有序序列,包含两个序列中所有的不重复元素。 //src1,src2必须已排序 template void SetUnion(CArray& dest,const CArray& src1,const CArray& src2) { dest.SetSize(src1.GetSize()+src2.GetSize()); const TYPE* p = std::set_union(src1.GetData(),src1.GetData()+src1.GetSize(), src2.GetData(),src2.GetData()+src2.GetSize(), dest.GetData()); dest.SetSize(p-dest.GetData()); }; //构造一个有序序列,其中元素在两个序列中都存在。 //src1,src2必须已排序 template void SetIntersection(CArray& dest,const CArray& src1,const CArray& src2) { dest.SetSize(min(src1.GetSize(),src2.GetSize())); const TYPE* p = std::set_intersection(src1.GetData(),src1.GetData()+src1.GetSize(), src2.GetData(),src2.GetData()+src2.GetSize(), dest.GetData()); dest.SetSize(p-dest.GetData()); }; //构造一个有序序列,该序列取两个序列的对称差集(并集-交集) //src1,src2必须已排序 template void SetSymmetricDifference(CArray& dest,const CArray& src1,const CArray& src2) { dest.SetSize(src1.GetSize()+src2.GetSize()); const TYPE* p = std::set_symmetric_difference(src1.GetData(),src1.GetData()+src1.GetSize(), src2.GetData(),src2.GetData()+src2.GetSize(), dest.GetData()); dest.SetSize(p-dest.GetData()); }; CString LngArrToStr(const CArray& src)//将long数组转成str,方便排错 { CString str; str.Format("%d个元素 ",src.GetSize()); for(int i = 0 ; i < src.GetSize() ; i++ ) { CString s; s.Format("%d ",src[i]); str += s; } return str; } void GongNengCeShi()//功能测试 { srand(GetTickCount()); const int iNum = 11; CArray src1,src2; src1.SetSize(iNum); src2.SetSize(iNum); for( int i = 0 ; i < iNum ; i++) { src1[i] = rand()%10; src2[i] = rand()%10; } const CString str1 = LngArrToStr(src1); const CString str2 = LngArrToStr(src2); Sort(src1); Sort(src2); const CString str3 = LngArrToStr(src1); const CString str4 = LngArrToStr(src2); CArray dst; SetDifference(dst,src1,src2); const CString str5 = LngArrToStr(dst); SetUnion(dst,src1,src2); const CString str6 = LngArrToStr(dst); SetIntersection(dst,src1,src2); const CString str7 = LngArrToStr(dst); SetSymmetricDifference(dst,src1,src2); const CString str8 = LngArrToStr(dst); } //给数组增加元素,可以连续调用。 template class CTestArray : public CArray { public: CTestArray& AddLianXu(ARG_TYPE newElement) { Add(newElement); return *this; }; }; void BianJieCheShi()//边界测试 { CTestArray src1,src2; src1.AddLianXu(1).AddLianXu(2).AddLianXu(3); Sort(src1); Sort(src2); CArray dst; //结果就是src1 SetDifference(dst,src1,src2); const CString str1 = LngArrToStr(dst); //结果为空 SetDifference(dst,src1,src1); const CString str2 = LngArrToStr(dst); CTestArray src3; src3.AddLianXu(4).AddLianXu(5); //无重无元素 SetUnion(dst,src1,src3); const CString str3 = LngArrToStr(dst); //全部是重复元素 SetUnion(dst,src1,src1); const CString str4 = LngArrToStr(dst); //无重无元素 SetIntersection(dst,src1,src3); const CString str5 = LngArrToStr(dst); //全部是重复元素 SetIntersection(dst,src1,src1); const CString str6 = LngArrToStr(dst); //无重无元素 SetSymmetricDifference(dst,src1,src3); const CString str7 = LngArrToStr(dst); //全部是重复元素 SetSymmetricDifference(dst,src1,src1); const CString str8 = LngArrToStr(dst); }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:干扰数
下一篇:学习Mvp的小项目,架构比较简单,遵循谷歌官方的方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~