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

📄 dse_classes.hpp

📁 Gramham法求解凸包。从最基本数据结构定义开始实现
💻 HPP
字号:
#ifndef __DSE_CLASSES_H__
#define __DSE_CLASSES_H__


namespace dse
{
    //##ModelId=443378C800A6
    typedef unsigned int size_t;

    //VC6不支持类内静态常量的初始化附值,
    //这里折中采用了宏定义的方法
    //如果是VC7或者VC8就可以做到一个类里面去了。
    #define DOUBLE_EPS  1.0e-9
    #define PI  3.141592653
    #define NPOS 0xffffffff
    #define IS_ZERO(v) (-DOUBLE_EPS<=(v) && (v)<= DOUBLE_EPS)

    //输出调试信息
    template<typename T> void DPRINTF(T fmt, ...)
    {        
        char tmp[1024];
            va_list ap;
        va_start(ap, fmt);
        _vsnprintf(tmp, sizeof(tmp), fmt, ap);
        va_end(ap);
            OutputDebugStringA(tmp);
    }

    //可变数组
    //##ModelId=443378C800B7
    template<typename T>class array
    {
    private:
        //##ModelId=443378C800C2
        T *items_;      //元素
        //##ModelId=443378C800C3
        size_t size_;   //大小
    public:
        //##ModelId=443378C800CB
        array()
        {
            items_ = NULL;
            size_ = 0;
        }

        //初始化一个大小为n的数组
        //##ModelId=443378C800CC
        array(size_t n)
        {
            if(n != 0)
            {
                items_ = new T[n];
                size_ = n;
            }
            else
            {
                items_ = NULL;
                size_ = 0;
            }
        }

        //##ModelId=443378C800CE
        ~array()
        {
            if(items_)
                delete []items_;
        }

        //返回当前数组大小
        //##ModelId=443378C800CF
        inline size_t size()
        {
            return size_;
        }

        //取得数组第i个元素
        //##ModelId=443378C800D0
        T &operator [](size_t i)
        {
            return items_[i];
        }
    
        //调整数组大小到n
        //如果 n 大于当前大小,则后面的内存不做初始化。
        //如果 n 小于当前大小,则截断超出的元素
        //##ModelId=443378C800D6
        void resize(size_t new_size)
        {
            T *new_items = new T[new_size];
            size_t i = 0;
            while(i < size_ && i < new_size)
            {
                new_items[i] = items_[i];
                i++;
            }

            if(items_)
                delete []items_;

            items_ = new_items;
            size_ = new_size;
        }
    };


    //向量,支持按下标随机访问元素、从尾部添加元素、从尾部删除元素、删除第i个元素
    //##ModelId=443378C800DF
    template<typename T> class vector : public array<T>
    {
        //##ModelId=443378C801E5
        size_t size_;

    public:
        //##ModelId=443378C80201
        typedef T value_type;

        //##ModelId=443378C801E6
        vector()
            : array<T>(1)
        {
            size_ = 0;
        }

        //当前向量的大小
        //##ModelId=443378C801ED
        size_t size()
        {
            return size_;
        }

        //从尾部删除元素
        //##ModelId=443378C801EE
        void pop_back()
        {
            size_ --;
        }

        //清空
        //##ModelId=443378C801EF
        void clear()
        {
            size_ = 0;
        }

        //删除第i个元素
        //##ModelId=443378C801F0
        void erase(size_t i)
        {
            for(size_t j = i + 1; j < size_; j++)
            {
                (*this)[j - 1] = (*this)[j];
            }
            size_ --;
        }

        //从pos位置开始搜索等于t的元素
        //##ModelId=443378C801F8
        void find(T t, size_t pos = 0)
        {
            for(size_t i = pos; i < size_ ; i++)
                if((*this)[i] == t)
                    return i;
            return NPOS;
        }

        //从尾部追加元素
        //##ModelId=443378C801FB
        void push_back(T t)
        {
            if(array<T>::size() == size_)
            {
                //内存递增算法
                //如果当前 size_ 比较小,则翻倍
                //如果当前 size_ 比较大,则线性增长
                //TODO: 试验一个合理的分解点和合理的线性增长量
                if(size_ < 4096)
                    array<T>::resize(size_ * 2);
                else
                    array<T>::resize(size_ + 4096);
            }
            (*this)[size_] = t;
            size_++;
        }
    };

    //通用的数据比较仿函数,比较 a < b 是否成立
    //##ModelId=443378C80203
    template <typename T>class gernic_less
    {
    public:
        //##ModelId=443378C8020C
        bool operator()(const T &a, const T &b)
        {
            return a < b;
        }
    };

    //交换两个变量
    template <typename T> void swap(T &a, T &b)
    {
        T c(a);
        a = b;
        b = c;
    };

    //快速排序算法, a是待排序的数组,low, high为开始,结束元素位置,less为比较仿函数
    //TODO: 对这个原始的快速排序算法改进,提高效率,减少递归栈深度
    template<typename T, typename L> void quick_sort(T &a, int low, int high, L &less)
    { 
        if (low >= high) return; 

        int i = low, j = high;
        T::value_type pv(a[(low + high) / 2]); 

        do
        {
            while (less(a[i], pv)/*(a[i] < pv)*/ && (i < high)) i++;
            while (less(pv, a[j])/*(a[j] > pv)*/ && (j > low)) j--;

            if (i <= j)
                swap(a[i++], a[j--]);

        } while (i <= j);

        if(low < j) quick_sort (a, low, j, less);
        if(high > i) quick_sort (a, i, high, less);
    };

    //二元组, first的类型为T1, second的类型为T2
    //##ModelId=443378C80215
    template<typename T1, typename T2> class pair
    {
    public:
        //##ModelId=443378C80221
        T1 first;
        //##ModelId=443378C80222
        T2 second;

        //##ModelId=443378C80229
        pair()
            : first(), second()
        {

        }
        //##ModelId=443378C8022A
        pair(pair<T1, T2> & other)
            : first(other.first), second(other.second)
        {
        }
        //##ModelId=443378C8022C
        pair(T1 a, T2 b)
            : first(a), second(b)
        {
        }
        //##ModelId=443378C8022F
        pair<T1, T2> & operator = (pair<T1, T2> &other)
        {
            first = other.first;
            second = other.second;
            return *this;
        }
    };

    //构造一个二元组
    template<typename T1, typename T2> pair<T1, T2> make_pair(T1 a, T2 b)
    {
        return pair<T1, T2>(a, b);
    }
};
#endif//__DSE_CLASSES_H__

⌨️ 快捷键说明

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