• <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

            創(chuàng)作,也是一種學(xué)習(xí)的過(guò)程。

               :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            數(shù)組是最最常用的數(shù)據(jù)結(jié)構(gòu)之一,我們現(xiàn)在往數(shù)組中加入元素,當(dāng)數(shù)組被加滿(mǎn)時(shí),我們希望最早加入數(shù)組的元素就被沖掉,像一個(gè)隊(duì)列那樣,那應(yīng)該如何實(shí)現(xiàn)呢?我寫(xiě)了個(gè)類(lèi)模板,非常簡(jiǎn)單,初步測(cè)試下來(lái)還沒(méi)發(fā)現(xiàn)什么問(wèn)題。
            #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;
            }
            這是測(cè)試代碼:
            #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;
            }
            代碼執(zhí)行結(jié)果如下:
            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 閱讀(411) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): Knowledge

            評(píng)論

            # re: 一個(gè)"滾動(dòng)數(shù)組"類(lèi)模板 2010-06-18 13:46 Matthew
            哈哈,
            重寫(xiě)運(yùn)算符,
            我都沒(méi)有想到
            我看到需求,第一個(gè)反應(yīng)就是建立映射關(guān)系,
            把相對(duì)應(yīng)的index映射,浪費(fèi)了內(nèi)存,而且很不好用
              回復(fù)  更多評(píng)論
              

            亚洲中文字幕无码久久2017 | 精品久久综合1区2区3区激情| 99久久国产热无码精品免费 | 久久这里都是精品| 伊人久久大香线蕉综合5g| 无码人妻精品一区二区三区久久| 久久久久人妻一区精品性色av| 久久99精品国产99久久6男男| 国产三级精品久久| 久久精品一本到99热免费| 狠色狠色狠狠色综合久久 | 久久国产精品免费一区| 久久亚洲AV无码精品色午夜| 精品久久8x国产免费观看| 久久久久国产日韩精品网站| 少妇久久久久久久久久| 久久国产成人亚洲精品影院| 成人国内精品久久久久影院| 超级97碰碰碰碰久久久久最新| 午夜不卡888久久| 久久中文骚妇内射| 东方aⅴ免费观看久久av| 久久99精品久久久久久噜噜| 久久久精品2019免费观看| 色妞色综合久久夜夜| 久久精品国产一区二区电影| 国产精品久久久天天影视| 漂亮人妻被黑人久久精品| 久久久久亚洲av综合波多野结衣| 99久久精品国内| WWW婷婷AV久久久影片| 午夜精品久久久久久久久| 久久99久国产麻精品66| 无码人妻久久一区二区三区蜜桃| 欧美大战日韩91综合一区婷婷久久青草| 精品久久久久久综合日本| …久久精品99久久香蕉国产| 99久久免费国产精精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲国产精品久久久久网站| 久久99国产精品二区不卡|