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

简介: 利用stl的集合类函数 操作mfc数组
#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);
}
相关文章
|
7月前
|
Java C语言 C++
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现(上)
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现
57 4
|
7月前
|
C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(下)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
53 3
|
6月前
|
C++ 容器
C++ STL标准库 《map容器详解》
C++ STL标准库 《map容器详解》
47 0
|
6月前
|
存储 安全 Java
java泛型与迭代器的关系
java泛型与迭代器的关系
|
7月前
|
编译器 测试技术 C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(上)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
48 0
|
7月前
|
算法 Java Linux
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现(下)
从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现
41 0
|
存储 Rust 对象存储
【Rust】枚举类型创建单链表以及常见的链表操作方法
单链表(Linked List)是一种线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表的特点是每个节点只能指向一个下一个节点,没有指向上一个节点的指针。
125 0
【Rust】枚举类型创建单链表以及常见的链表操作方法
|
存储 C++ 索引
1.1 C++ STL 字符串构造函数
String 字符串操作容器是C++标准中实现的重要容器,其主要用于对字符串的高效处理,它和C风格中的`string.h`并不是同一个库,两个库有极大的差距,C库中的`string.h`主要面向过程提供一些处理函数,而C++库中的`string`则是基于类实现的更高效的一种字符串处理方法集,类中提供了非常方便的成员函数供我们使用.
48 0
|
人工智能
CPP2022-22-数组进阶-动态数组(下)
CPP2022-22-数组进阶-动态数组
189 0