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 阅读(393) 评论(1)  编辑 收藏 引用 所属分类: Knowledge

评论

# re: 一个"滚动数组"类模板 2010-06-18 13:46 Matthew
哈哈,
重写运算符,
我都没有想到
我看到需求,第一个反应就是建立映射关系,
把相对应的index映射,浪费了内存,而且很不好用
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理