参考:模板数组源代码

原创 2004年09月28日 16:48:00
#ifndef sptplarr_h
#define sptplarr_h

#include <assert.h>
#include <string.h>
#include "sptexc.h"

namespace spt
{
    namespace tpl
    {
///////////////////////////////////////////////////////////////////////////////////////////////////

        template<class T>
            class Array
        {
        public:
            Array();
            Array(long count);
            Array(Array<T> &array);
            virtual ~Array();
            Array<T> & operator=(Array<T> &array);
        public:
            void Create(long count);
            void SetCount(long count);
            void SetSize(long size);
            void Release();
            void Empty(){ m_count = 0; }
        public:
            void SetAll(T elem);
            void AddElem(T &elem);
            void SetPerAllocSize(long size){ if(size > 0) m_per_alloc_size = size; }
        public:
            long GetSize(){ return m_size; }
            long GetCount(){ return m_count; }
            T * GetBuffer(){ return m_data; }
            bool IsEmpty(){ return m_count == 0; }
            bool IsReleased(){ return m_data == NULL; }
            bool IsInside(long pos){ return pos >= 0 && pos < m_count; }
            long GetPerAllocSize(){ return m_per_alloc_size; }
        public:
            T & operator[](long pos){ return m_data[pos]; }
        protected:
            void Resize(long size);
        private:
            void Init();
            long GetNeedAllocSize(long size);
        private:
            T *m_data;
            long m_count;
            long m_size;
            long m_per_alloc_size;
        };

///////////////////////////////////////////////////////////////////////////////////////////////////

        template<class T>
            Array<T>::Array()
        {
            Init();
        }

        template<class T>
            Array<T>::Array(Array<T> &array)
        {
            Init();
            *this = array;
        }

        template<class T>
            Array<T>::Array(long count)
        {
            Init();
            Create(count);
        }

        template<class T>
            Array<T>::~Array()
        {
            Release();
        }
        
        template<class T>
            Array<T> & Array<T>::operator=(Array<T> &array)
        {
            if(this == &array)
                return *this;

            SetCount(array.m_count);
            for(long i=0; i<m_count; i++)
                m_data[i] = array.m_data[i];

            return *this;
        }

///////////////////////////////////////////////////////////////////////////////////////////////////

        template<class T>
            inline void Array<T>::Init()
        {
            m_data = NULL;
            m_count = m_size = 0;
            m_per_alloc_size = sptDefaultPerAllocSize;
            assert(m_per_alloc_size > 0);
        }

        template<class T>
            inline void Array<T>::Release()
        {
            delete[] m_data;
            Init();
        }

        template<class T>
            void Array<T>::Resize(long size)
        {
            if(size < 0)
                return;

            if(size == 0)
            {
                Release();
                return;
            }

            size = GetNeedAllocSize(size);
            if(m_count == 0)
            {
                Release();

                m_data = new T [size];
                if(m_data == NULL)
                    throw Exception(fail_alloc);

                m_count = 0;
                m_size = size;
            }
            else
            {
                long count = spt_min(m_count, size);
                
                long tmp_size = count * sizeof(T);
                char *tmp = new char [tmp_size];
                if(tmp == NULL)
                    throw Exception(fail_alloc);

                T *data = new T [size];
                if(data == NULL)
                    throw Exception(fail_alloc);

                memcpy(tmp, m_data, tmp_size);
                memcpy(m_data, data, tmp_size);
                memcpy(data, tmp, tmp_size);

                delete[] tmp;
                Release();

                m_data = data;
                m_count = count;
                m_size = size;
            }
        }

        template<class T>
            inline long Array<T>::GetNeedAllocSize(long size)
        {
            assert(size > 0);
            assert(m_per_alloc_size > 0);

            return (size + m_per_alloc_size + 1) / m_per_alloc_size * m_per_alloc_size;
        }

        template<class T>
            inline void Array<T>::Create(long count)
        {
            Release();
            SetCount(count);
        }

        template<class T>
            inline void Array<T>::SetCount(long count)
        {
            if(count > m_size)
                Resize(count);

            m_count = count;
        }

        template<class T>
            inline void Array<T>::SetSize(long size)
        {
            if(size > m_size)
                Resize(size);
        }

///////////////////////////////////////////////////////////////////////////////////////////////////

        template<class T>
            inline void Array<T>::SetAll(T elem)
        {
            for(long i=0; i<m_count; i++)
                m_data[i] = elem;
        }

        template<class T>
            inline void Array<T>::AddElem(T &elem)
        {
            SetCount(m_count + 1);
            m_data[m_count - 1] = elem;
        }

///////////////////////////////////////////////////////////////////////////////////////////////////
    } // namespace tpl
} // namespace spt

#endif
// sptplarr.h

C++模板参数为数组

本想写个模板函数,然后导成DLL,然后可以到处引用。可是后来发现,我的想法很天真。 由于C++是强类型语言,所以模板在用的时候必须确定其类型。而C++的模板只是一种语法糖,只不过是编译器在后台在做字...
  • ec06cumt
  • ec06cumt
  • 2012年11月07日 15:31
  • 1390

VS源代码项目管理参考

http://blog.csdn.net/akof1314/article/details/7190822
  • leiych
  • leiych
  • 2013年07月19日 00:40
  • 1438

自己的底层代码库(十六)——数组模板

这里放上一个数组模板,主要是封装了一下一维数组,和二维数组的
  • zilaishuichina
  • zilaishuichina
  • 2014年07月09日 12:19
  • 916

C++实践参考——处理C++源代码的程序

返回:贺老师课程教学链接  项目要求【项目4 - 处理C++源代码的程序】  在CodeBlocks等IDE中都提供了代码格式整理的功能。完成这种功能的程序,操作的数据是用C++写的源代码文件。C++...
  • sxhelijian
  • sxhelijian
  • 2015年06月02日 09:08
  • 1780

C++ 数组类模板

对于学习C++类模板来说,这个例子是个很值得研究的代码,包含了很多信息。所谓类模板,本人粗浅的理解就是当你的类中含有通用的数据类型时候,就可以用类模板,比如说,你开发一个类,他包含的数据可能是整数型,...
  • hellofeiya
  • hellofeiya
  • 2012年08月07日 15:23
  • 2395

C++模板实现智能数组类

这个类的使用非常有限,不能说是真正的智能数组 对于一般的数据类型还可以,比如int /float/char等 但是,string类这样的类类型好像不是很好 但是一些基础的东西却是学习的重点 头...
  • mfcing
  • mfcing
  • 2012年03月27日 22:39
  • 3451

C++实践参考:数组类模板

【项目-数组类模板】   在数组类的基础上,将之改造为类模板,以使数组中可以存储各种类型的数据。template //数组类模板定义 class Array { private: T* ...
  • sxhelijian
  • sxhelijian
  • 2016年05月26日 15:19
  • 3409

hihocoder 1014 Trie树 (Trie 记模板 数组+指针)

hihocoder 1014 Trie树 (Trie 记模板 数组+指针)
  • Tc_To_Top
  • Tc_To_Top
  • 2016年03月08日 12:28
  • 735

ecshop在前台模板中打印数组

ecshop在前台模板中打印数组
  • pt1742395895
  • pt1742395895
  • 2016年10月27日 14:14
  • 1549

django 模板中使用数组形式

使用如下s {{ array.0 }} {{ array.1 }} 可参见http://www.yzddtk.com/yizhandaodi-380043-1-1.html...
  • u013480667
  • u013480667
  • 2015年02月02日 16:19
  • 2830
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:参考:模板数组源代码
举报原因:
原因补充:

(最多只允许输入30个字)