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

利用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-04-19
  • 长效机制加速推进 楼市下半年或持续降温 2019-04-19
  • 树立文化自信 创新节庆模式 2019-04-19
  • 朝韩将军级会谈时隔11年后在板门店重启 2019-04-19
  • 经济日报多媒体数字报刊 2019-04-18
  • 搞好公有制就是好,故得出结论:计划经济好。 2019-04-18
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-04-18
  • 南海网-海南新闻网-权威媒体 海南门户 2019-04-17
  • 海底捞回应侵犯音乐人林海著作权:已停止播放 2019-04-17
  • 自然型社会和规则性社会,是会随着科技的改变而发生改变的,当然只有规矩也就是制度才能规范人的行为,所以国家是不会灭亡的,但国家的形式是会发生改变的。 2019-04-17
  • 惊艳!上外学子英译60首热门中文歌  让世界倾听中国 2019-04-16
  • 西安,给盲人朋友留一条路吧…无障碍设施盲道-编辑整合 2019-04-16
  • 的确如此。报刊亭取消的确是短视行为。把报刊亭设计的现代化一些,与城市绿化衔接起来,相得益彰,成为文化一景多好。 2019-04-16
  • 让更多企业和劳动者尝到协商的“甜头” 2019-04-16
  • 2014金家岭财富论坛嘉宾云集(二) 2019-04-15
  • 710| 29| 974| 208| 958| 196| 906| 536| 378| 622|