⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xset.h

📁 BCB的学习资料
💻 H
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#ifndef XSetH
#define XSetH
#ifndef XArrayH
#include <XArray.h>
#endif
//---------------------------------------------------------------------------
namespace zdhsoft
{

/*
///////////////////////////////////////////////////////////////////////////////
[Name]XSet<T>
[Title]集合类
///////////////////////////////////////////////////////////////////////////////
[Description]
    修改了构造函数,让它能事情准备好一定的元素,到动态数组
    给一些方法增加了const,如==,!=,[]等操作运算符
    对大部分代码做了调整,优化了代码
[Version]2.2
[Author]Rex Winter
[Date]2005-6-22
[Test]
    2005-6-22 完成对XSet所有方法的测试
///////////////////////////////////////////////////////////////////////////////
[Description]
    新增了一个构造函数XSet<T>(const T &);
    修改了一些方法的参数,将其参数设为const T & 避免产生一些没有必要的代码
    修改了一个Bug
[Version]2.1
[Author]Rex Winter
[Date]2005-3-26
///////////////////////////////////////////////////////////////////////////////
[Description]
    这是一个集合类
    这个类的元素存放是一个有序的数组。
    这个类的元素查找方法为二分查找。
    这个类提供了类相关的所有功能
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
///////////////////////////////////////////////////////////////////////////////
*/
template<class T>
class XSet
{
public:
    XSet(int iPrepareLength = 0);
    XSet(const XSet<T> & rhs);
    XSet(const T & vMin,const T & vMAX,int iPrepareLength = 0);
    //XSet(const T & v,int iPrepareLength = 0);
    void Clear();   //清空集合
    XSet<T> & operator << (const T & data); //加入一个元素
    XSet<T> & operator >> (const T & data); //删除一个元素
    XSet<T> & operator << (const XSet<T> & rhs); //加入一个集合中的有元素
    XSet<T> & operator >> (const XSet<T> & rhs); //删除一个集合中的有元素
    void Add(const T & data);     //加入一个元素
    void Add(const XSet<T> & rhs); //加入一个集合中的有元素
    void Delete(const T & data);  //删除一个元素
    void Delete(const XSet<T> & rhs);//删除一个集合中的有元素
    bool Contains(const T & data) const;
    bool Contains(const XSet<T> & rhs) const;
    int GetLength() const { return m_Data.GetLength(); }
    T & operator[](int Index);
    const T & operator[](int Index) const;
    bool Empty() const;
    XSet<T> & operator=(const XSet<T> & rhs);

    XSet<T> operator-(const XSet<T> & rhs) const; //差集
    XSet<T> operator+(const XSet<T> & rhs) const; //合集
    XSet<T> operator*(const XSet<T> & rhs) const; //交集

    XSet<T> SubSet(const T & MinData,const T & MaxData) const;

    XSet<T> & operator-=(const XSet<T> & rhs); //差集
    XSet<T> & operator+=(const XSet<T> & rhs); //合集
    XSet<T> & operator*=(const XSet<T> & rhs); //交集


    bool operator == (const XSet<T> & rhs) const;
    bool operator != (const XSet<T> & rhs) const;
public:
    __property int Length = { read = GetCount };    
private:
    int _Contains(const T & data) const;//采用二分查找
    void _Insert(const T & data); //插入一个元素
    int GetCount() { return m_Data.GetLength(); } //这个主要供属Length使用
private:
    XDynamicArray<T> m_Data;//存放集合数据的数组
};
//---------------------------------------------------------------------------
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Clear
[Title]清空集合
////////////////////////////////////////////////////////////////////////////////
[param]
[Description]
    清空集合
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::Clear()
{
    m_Data.Clear();
};
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator <<
[Title]插入一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T> data 将被插入的元素
[Return]
    <XSet<T> &> 返回当前集合的引用
[Description]
    向集合中,填加一个元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XSet<T> & XSet<T>::operator << (const T & data)
{
    Add(data);
    return *this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator >>
[Title]删除一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T> data 将被删除的元素
[Return]
    <XSet<T> &> 返回当前集合的引用
[Description]
    向集合中,删除一个元素,如果该元素存在的话,那就删除
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XSet<T> & XSet<T>::operator >> (const T & data)
{
    Delete(data);
    return *this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator <<
[Title]填加一个集合中元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XSet<T> &> rhs 将被添加的集合
[Return]
    <XSet<T> &> 返回当前集合的引用
[Description]
    将一个集合的元素添加到当前集合
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XSet<T> & XSet<T>::operator << (const XSet<T> & rhs)
{
    Add(rhs);
    return *this;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator >>
[Title]删除一个集合中元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XSet<T> &> rhs 将被删除的集合
[Return]
    <XSet<T> &> 返回当前集合的引用
[Description]
    从当前集合中,删除该集合拥有的元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
XSet<T> & XSet<T>::operator >> (const XSet<T> & rhs)
{
    Delete(rhs);
    return *this;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]Add
[Title]插入一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T> data 将被插入的元素
[Description]
    向集合中,填加一个元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::Add(const T & data)
{
    _Insert(data);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Add
[Title]插入一个集合的元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XSet<T> &> rhs 将被插入的元素
[Description]
    当集合中,所有元素插入到当前集合中
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::Add(const XSet<T> & rhs)
{
    if( this != &rhs )
    {
        const T * Data = rhs.m_Data.Data();
        int iLength = rhs.GetLength();
        for( int i=0; i<iLength; i++) Add( *Data++ );
    }
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Delete
[Title]删除元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T> data 将被删除的元素
[Description]
    删除当前集合中指定的元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::Delete(const T & data)
{
    int Index = _Contains(data);
    if( Index > -1 ) m_Data.Delete(Index);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Delete
[Title]删除一个集合中拥有的元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XSet<T> &> rhs被删除元素的集合
[Description]
    删除在集合中有的元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::Delete(const XSet<T> & rhs)
{
    if( this != &rhs )
    {
        const T * Data = rhs.m_Data.Data();
        int iLength = rhs.m_Data.GetLength();
        Data += iLength;
        for(int i=0; i<iLength; i++) Delete(*(--Data));
    }
    else Clear();
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]_Contains
[Title]包含元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T > data 被检查的元素
[Return]
    <int> 返回该元素所在下标,如果不存在则返回-1
[Description]
    检查该元素是否被包含,如果被包含,则返回其下标
    否则返回-1
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
int XSet<T>::_Contains(const T & data) const
{
    const T * DataArray = m_Data.Data();
    int Count = m_Data.GetLength();
    int Low = 0,High = Count-1,Mid;
    while( Low <= High )
    {
        Mid = (Low + High) /2;
        T Tmp = DataArray[Mid];
        if( Tmp == data ) return Mid;
        else if ( Tmp > data ) High = Mid -1;
        else Low = Mid + 1;
    }
    return -1;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Contains
[Title]包含元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T &> data 被检查的元素
[Return]
<bool> 如果该元素存在,则返回true,否则返回-1
[Description]
    检查该元素是否被包含
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
bool XSet<T>::Contains(const T & data) const
{
    if( _Contains(data) > -1 )  return true;
    else return false;
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]Contains
[Title]包含集合
////////////////////////////////////////////////////////////////////////////////
[param]
    <const XSet<T> &> rhs 被检查的集合
[Return]
<bool> 如果该集合被包含,则返回true,否则返回-1
[Description]
    检查该集合是否被包含
[Version]1.0
[Author]Rex Winter
[Date]2005-6-22
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
bool XSet<T>::Contains(const XSet<T> & rhs) const
{
    if( this == &rhs ) return true;
    if( rhs.Empty() ) return true;
    int iLength = rhs.m_Data.GetLength();
    if( iLength > m_Data.GetLength() ) return false;
    const T * Data = rhs.m_Data.Data();
    for(int i=0; i<iLength; i++,Data++)
    {
        if( !Contains(*Data) ) return false;
    }
    return true;
}

/*
////////////////////////////////////////////////////////////////////////////////
[Name]_Insert
[Title]插入一个元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <const T > data 被插入集合
[Description]
    向当前集合中,插入一个元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
void XSet<T>::_Insert(const T & data)
{
    int iLength = m_Data.GetLength();
    if( iLength == 0 )
    {
        m_Data.Append( data );
        return;
    }
    const T * DataArray = m_Data.Data();
    //查找插入的位置
    int Low = 0,High = iLength-1,Mid;
    while( Low <= High )
    {
        Mid = (Low + High) /2;
        T Tmp = DataArray[Mid];
        if( Tmp == data ) return; //如果已有该元素,则返回
        else if ( Tmp > data ) High = Mid -1;
        else Low = Mid + 1;
    }
    if( DataArray[Mid] > data ) m_Data.Insert(Mid,data);
    else m_Data.Insert(Mid+1,data);
}
/*
////////////////////////////////////////////////////////////////////////////////
[Name]operator[]
[Title]取元素
////////////////////////////////////////////////////////////////////////////////
[param]
    <int T > Index 要取的数组下标
[Return]
    <T>返回当前元素    
[Description]
    取指定下标的元素
[Version]2.0
[Author]Rex Winter
[Date]2004-12-9
////////////////////////////////////////////////////////////////////////////////
*/
template<class T>
T & XSet<T>::operator[](int Index)
{
    return m_Data[Index];
}
template<class T>
const T & XSet<T>::operator[](int Index) const

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -