• <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映射,浪費了內存,而且很不好用
              回復  更多評論
              

            久久久精品国产免大香伊| 久久久久久免费视频| 久久精品九九亚洲精品| 伊人色综合久久天天| 欧美激情一区二区久久久| 久久精品亚洲精品国产色婷| 久久男人Av资源网站无码软件 | 国产精品嫩草影院久久| 中文字幕精品久久久久人妻| 久久精品国产亚洲沈樵| 中文字幕无码精品亚洲资源网久久| 成人亚洲欧美久久久久| 2021最新久久久视精品爱| 精品熟女少妇a∨免费久久| 久久精品国产99国产精品导航| 色综合久久综合中文综合网| 中文字幕乱码久久午夜| 99热成人精品免费久久| 久久久久人妻一区精品色| 久久91精品综合国产首页| 青青热久久综合网伊人| 久久中文字幕一区二区| 中文字幕久久精品无码| 九九精品久久久久久噜噜| 国产2021久久精品| 日本精品久久久久中文字幕8| 一本色道久久99一综合| 久久久久久伊人高潮影院| 久久亚洲国产成人影院网站 | 精品久久久噜噜噜久久久| 久久久久久精品久久久久| 久久影院久久香蕉国产线看观看| 国产精品久久久久久福利漫画| 99久久精品国产一区二区| WWW婷婷AV久久久影片| 久久国产高潮流白浆免费观看| 久久综合噜噜激激的五月天| 久久91精品国产91久久麻豆| 99久久久精品免费观看国产| 精品人妻久久久久久888| 精品乱码久久久久久久|