• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Jiang's C++ Space

            創作,也是一種學習的過程。

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            數組是最最常用的數據結構之一,我們現在往數組中加入元素,當數組被加滿時,我們希望最早加入數組的元素就被沖掉,像一個隊列那樣,那應該如何實現呢?我寫了個類模板,非常簡單,初步測試下來還沒發現什么問題。
            #pragma once

            #define DEFAULT_ARRAY_SIZE 20
            #define MINIMUM_ARRAY_SIZE 5

            template 
            <class T>
            class CRollArray
            {
            public:
                CRollArray(
            int iArraySize = DEFAULT_ARRAY_SIZE);
                
            ~CRollArray();
                T
            & operator[] (int iIndex);
                
            void Add(T element);
                
            int GetSize();
                
            void Reset();
            private:
                T
            * m_pData;
                
            int m_iBegin;
                
            int m_iEnd;
                
            int m_iArrSize;
            };

            template 
            <class T>
            CRollArray
            <T>::CRollArray(int iArraySize)
            {
                
            if (iArraySize<MINIMUM_ARRAY_SIZE)
                    iArraySize
            =MINIMUM_ARRAY_SIZE;

                m_pData 
            = new T[iArraySize];
                m_iBegin 
            = -1;
                m_iEnd 
            = -1;
                m_iArrSize 
            = iArraySize;
            }

            template 
            <class T>
            CRollArray
            <T>::~CRollArray(void)
            {
                
            if(m_pData!=NULL)
                    delete[] m_pData;
            }

            template 
            <class T>
            T
            & CRollArray<T>::operator[] (int iIndex)
            {
                
            if (m_iBegin+iIndex<m_iArrSize)
                    
            return m_pData[m_iBegin+iIndex];
                
            else
                    
            return m_pData[m_iBegin+iIndex-m_iArrSize];
            }

            template 
            <class T>
            void CRollArray<T>::Add(T element)
            {
                
            if(m_iEnd==m_iBegin-1)
                {
                    
            // xxxxEB
                    if(m_iBegin==m_iArrSize-1)
                    {
                        m_iEnd 
            = m_iBegin;
                        m_iBegin 
            = 0;
                    }
                    
            // xxxEBx
                    else
                    {
                        
            ++m_iEnd;
                        
            ++m_iBegin;
                    }
                }
                
            else
                {
                    
            // Null array.
                    if(m_iBegin==-1 && m_iEnd==-1)
                    {
                        m_iBegin 
            = 0;
                        m_iEnd 
            = 0;
                    }
                    
            else
                    {
                        
            // BxxxxE
                        if(m_iBegin==0 && m_iEnd==m_iArrSize-1)
                        {
                            
            ++m_iBegin;
                            m_iEnd 
            = 0;
                        }
                        
            // BxxExx
                        else
                        {
                            
            ++m_iEnd;
                        }
                    }
                }

                m_pData[m_iEnd] 
            = element;
            }

            template 
            <class T>
            int CRollArray<T>::GetSize()
            {
                
            if (m_iEnd==m_iBegin-1 || (m_iBegin==0 && m_iEnd==m_iArrSize-1))
                    
            return m_iArrSize;

                
            if(m_iBegin==-1 && m_iEnd==-1)
                    
            return 0;

                
            return m_iEnd-m_iBegin+1;
            }

            template 
            <class T>
            void CRollArray<T>::Reset()
            {
                m_iBegin 
            = -1;
                m_iEnd 
            = -1;
            }
            這是測試代碼:
            #include "RollArray.h"

            int _tmain(int argc, _TCHAR* argv[])
            {
                CRollArray
            <int> arrTest(10);
                printf(
            "size: %d\n", arrTest.GetSize());
                arrTest.Add(
            1);
                printf(
            "size: %d\n", arrTest.GetSize());
                printf(
            "idx0: %d\n", arrTest[0]);
                arrTest.Reset();
                printf(
            "size: %d\n", arrTest.GetSize());
                arrTest.Add(
            81);
                arrTest.Add(
            4);
                arrTest.Add(
            52);
                arrTest.Add(
            123);
                arrTest.Add(
            78);
                arrTest.Add(
            987);
                arrTest.Add(
            111);
                printf(
            "size: %d\n", arrTest.GetSize());
                
            int i;
                
            for(i=0; i<arrTest.GetSize(); i++)
                    printf(
            "%d ", arrTest[i]);
                printf(
            "\n");

                arrTest.Add(
            321);
                arrTest.Add(
            3);
                arrTest.Add(
            2);
                arrTest.Add(
            7);
                arrTest.Add(
            54);
                arrTest.Add(
            276);

                printf(
            "size: %d\n", arrTest.GetSize());
                
            for(i=0; i<arrTest.GetSize(); i++)
                    printf(
            "%d ", arrTest[i]);
                printf(
            "\n");

                arrTest.Add(
            94);
                arrTest.Add(
            53);
                arrTest.Add(
            40);
                arrTest.Add(
            70);
                arrTest.Add(
            102);
                arrTest.Add(
            138);
                arrTest.Add(
            461);
                arrTest.Add(
            110);

                printf(
            "size: %d\n", arrTest.GetSize());
                
            for(i=0; i<arrTest.GetSize(); i++)
                    printf(
            "%d ", arrTest[i]);
                printf(
            "\n");

                
            return 0;
            }
            代碼執行結果如下:
            size: 0
            size: 1
            idx0: 1
            size: 0
            size: 7
            81 4 52 123 78 987 111
            size: 10
            123 78 987 111 321 3 2 7 54 276
            size: 10
            54 276 94 53 40 70 102 138 461 110
            posted on 2010-06-18 13:10 Jiang Guogang 閱讀(405) 評論(1)  編輯 收藏 引用 所屬分類: Knowledge

            評論

            # re: 一個"滾動數組"類模板 2010-06-18 13:46 Matthew
            哈哈,
            重寫運算符,
            我都沒有想到
            我看到需求,第一個反應就是建立映射關系,
            把相對應的index映射,浪費了內存,而且很不好用
              回復  更多評論
              

            久久婷婷久久一区二区三区| 麻豆精品久久精品色综合| 精品无码人妻久久久久久| 国产精品九九九久久九九| 日韩人妻无码精品久久免费一 | 精品人妻伦一二三区久久| 97久久久久人妻精品专区| 精品久久久久久亚洲精品| 无码超乳爆乳中文字幕久久| 久久婷婷是五月综合色狠狠| 亚洲精品久久久www| 久久五月精品中文字幕| 亚洲国产精品成人久久蜜臀| 久久男人AV资源网站| 色播久久人人爽人人爽人人片aV| 99久久www免费人成精品| 精品久久久久一区二区三区 | 国产偷久久久精品专区| 亚洲国产精品无码久久久不卡| 久久亚洲日韩看片无码| 久久久老熟女一区二区三区| 精品久久久久久久无码| 久久久国产精品福利免费| 99精品伊人久久久大香线蕉| 久久亚洲中文字幕精品一区| 亚洲Av无码国产情品久久| 精品国产青草久久久久福利| 色综合久久无码中文字幕| 国产精品久久久久…| 国产精品美女久久久久av爽| 蜜臀久久99精品久久久久久| 伊人久久久AV老熟妇色| 精品999久久久久久中文字幕| 国产精品伦理久久久久久| 国产精品99久久久久久宅男小说| 无码AV波多野结衣久久| 国产A级毛片久久久精品毛片| 一级做a爰片久久毛片看看| 国产精品一久久香蕉产线看| 亚洲国产精品综合久久网络 | 久久久久久国产精品免费免费|