现在的位置: 首页 > 综合 > 正文

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

2018年07月11日 ⁄ 综合 ⁄ 共 3732字 ⁄ 字号 评论关闭
#include? <algorithm>
#include? "afxtempl.h"
//TYPE类必须有<
template<class TYPE, class ARG_TYPE>
void Sort(CArray<TYPE,ARG_TYPE>& dest)
{
?std::sort(dest.GetData(),dest.GetData()+dest.GetSize());
}
//构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。
//src1,src2必须已排序
template<class TYPE, class ARG_TYPE>
void SetDifference(CArray<TYPE,ARG_TYPE>& dest,const CArray<TYPE,ARG_TYPE>& src1,const CArray<TYPE,ARG_TYPE>& 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<class TYPE, class ARG_TYPE>
void SetUnion(CArray<TYPE,ARG_TYPE>& dest,const CArray<TYPE,ARG_TYPE>& src1,const CArray<TYPE,ARG_TYPE>& 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<class TYPE, class ARG_TYPE>
void SetIntersection(CArray<TYPE,ARG_TYPE>& dest,const CArray<TYPE,ARG_TYPE>& src1,const CArray<TYPE,ARG_TYPE>& 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<class TYPE, class ARG_TYPE>
void SetSymmetricDifference(CArray<TYPE,ARG_TYPE>& dest,const CArray<TYPE,ARG_TYPE>& src1,const CArray<TYPE,ARG_TYPE>& 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<long,const long&>& 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<long,const long&> 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<long,const long&> 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 TYPE, class ARG_TYPE>
class CTestArray : public CArray<TYPE,ARG_TYPE>
{
public:
?CTestArray<TYPE,ARG_TYPE>& AddLianXu(ARG_TYPE newElement)
?{
? Add(newElement);
? return *this;
?};
};
void BianJieCheShi()//边界测试
{
?CTestArray<long,const long&> src1,src2;
?src1.AddLianXu(1).AddLianXu(2).AddLianXu(3);
?Sort(src1);
?Sort(src2);
?CArray<long,const long&> dst;
?//结果就是src1
?SetDifference(dst,src1,src2);
?const CString str1 = LngArrToStr(dst);
?//结果为空
?SetDifference(dst,src1,src1);
?const CString str2 = LngArrToStr(dst);
?CTestArray<long,const long&> 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);
}

秒速赛车公式 www.l19l7.cn 抱歉!评论已关闭.

  • 马上背!十九大报告中的四个“新” 2019-02-16
  • 蒲县工商质监局非公党委举办2018元旦文艺会 2019-02-16
  • 人民网评:建设数字中国时不我待 2019-02-16
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2019-02-15
  • 雍正官窑:朕就是这样的品味(图) 2019-02-15
  • 西安司法考试将试点机考 2019-02-15
  • 人民日报新媒体矩阵聚焦十九大 融媒报道"给你好看" 2019-02-14
  • 社会主义是过渡阶段,最终实现共产主义才是其目的。社会主义是在消灭私有制,建立公有制直至无私,实现共产主义。 2019-02-14
  • 四轮电动车销售火爆存安全隐患 专家:需建国家标准 2019-02-14
  • 看懂汽车三元催化器工作原理后还能当金子卖?难为非洲兄弟了! 2019-02-14
  • 周杰伦昆凌为儿子庆生 小小周帅气入镜 2019-02-13
  • 都以为机器人普及了,一切都不是问题了?机器人不需要不断升级?机器人生产啥?不需要人设计? 2019-02-13
  • 价值-热门标签-华商生活 2019-02-13
  • 上合组织引领发展 吉中合作稳步前行——访吉尔吉斯斯坦总统热恩别科夫 2019-02-13
  • 互联网金融协会提示:防范变相“现金贷”业务风险 2019-02-12
  • 634| 639| 815| 287| 151| 729| 385| 762| 745| 386|