Symbian学习笔记(9):数组

来源:互联网 发布:常用网络命令 编辑:程序博客网 时间:2024/05/18 01:36

 收藏
数组是一个很基本的东西了,但是在Symbian中也做了比较人性化的封装,让我们可以省却不少代码,当然也让我们这些新手有点摸不着头脑。

三个类比较实用,需要掌握:TFixedArray、RArray和RPointerArray。

TFixedArray
它是最类似于我们平时使用的数组,从概念上或者从使用上都非常类似。
//声明
TFixedArray<TGridCell,81> iGrid;

//使用
void CSuDoScAppView::InitGrid()
...{
    for(TInt i=0;i<81;i++)
    ...{   
        if(iCurQs->data[i]==0)
        ...{
            iGrid[i].state=TGridCell::ECSTATE_EMPTY;
        }
        else
        ...{
            iGrid[i].state=TGridCell::ECSTATE_FIXED;
        }
        iGrid[i].value=iCurQs->data[i];
        for(TInt j=0;j<9;j++) iGrid[i].tries[j]=0;
    }
    if(iHeart!=NULL)...{
        iHeart->Cancel();
        iTime=0;
        iHeart->Start(ETwelveOClock,this);
    }
}
把它当成普通的数组来用就OK了,一般也就是用它重载的运算符[]和Count(),不需new也不需要delete。

RArray
从名字上看它以R开头,至少说明一点,在使用完后我们需要将它Close掉。在使用上也比较简单,类似于ArrayList吧。比如下面代码:
//声明
RArray<TQuestion>    iList;   

//使用
void CSuDoScAppCtrol::LoadQuestions()
...{
    RFile file;
    TBuf8<4> bufC4;
    TBuf8<81> bufC81;
   
    if(KErrNone==file.Open(iFs,KTiDataFile,EFileRead))
    ...{
        file.Read(bufC4,4);       
        TUint len=((TUint)bufC4[3]<<24)+((TUint)bufC4[2]<<16)+((TUint)bufC4[1]<<8)+(TUint)bufC4[0];
       
        for(int i=0;i<len;i++)...{
            TQuestion ti;
            bufC4.FillZ();
            file.Read(bufC4,4);
            ti.code=((TUint)bufC4[3]<<24)+((TUint)bufC4[2]<<16)+((TUint)bufC4[1]<<8)+(TUint)bufC4[0];
            bufC4.FillZ();
            file.Read(bufC4,4);
            ti.time=0;
            bufC81.FillZ();
            file.Read(bufC81,81);
            for(TInt i=0;i<81;i++)ti.data[i]=bufC81[i];
            iList.Append(ti);           
        }       
        file.Close();       
    }
   
}
除了在析构函数中需要iList.Close()以外,事先不需要做什么初始化工作,一个个的Append进去就可以了。它也重载了运算符[],可以简单地访问其中的元素。

另外,RArray还提供了插入、查找、排序等功能。

RPointerArray
名字上说明它与指针有关,的确它与RArray的差别在于它不是保存对象的副本而是保存对象的指针。所以,使用上需要自己负责将元素删除。
//声明
RPointerArray<CFbsBitmap> iThumbNormal;

//使用
for(TInt i=0,j=0;i<9;i++,j+=2)...{
        CFbsBitmap * b=NULL;
        CFbsBitmap * c=NULL;
        AknIconUtils::CreateIconL(b,c,iMFileName,EMbmSudoscY1+j,EMbmSudoscY1+j+1);       
        AknIconUtils::SetSize(b, TSize(22, 22));
        AknIconUtils::SetSize(c, TSize(22, 22));
        iThumbNormal.AppendL(b);
        iThumbNormalMask.AppendL(c);
    }

//删除
for(TInt i=0;i<9;i++)...{
        delete iThumbNormal[i];
        delete iThumbNormalMask[i];

}
iThumbNormal.Close();
此外,虽然SDK中我们也看到许多CDesXXXX的数组类,但是我觉得上面三个类应该可以应付我们大多数的场合了。

[补充@2008-3-24]
因为上面三个数组是平台缓冲的,所以并不适合在插入较多的场合,如果你的数组经常插入元素,还是建议使用CArrayXXXXXSeg之类的数组类来实现。

[补充@2008-3-25]
谢谢bluepac网友的讨论,现在我补充说明一下:

虽然我觉得上述三个数组类可以解决我们大多数的应用场合,但并非它们就是万能的了。

Symbian不提倡我们直接使用C++数组,就象不提倡我们直接使用int,char一样,它提供了大量的有益的替代类。我们只需要记住:既然在Symbian平台上开发,就要听话哦。反正我从小都一直是听话的孩子。

还有两类数组,一类是描述符作为元素的CDesCXXX or CPtrCXXX。很好理解它们的元素都是描述符罢了,只是注意它的名称后面有一个Flat或者Seg,表示是平面(连续空间、访问效率高)还是分段(非连续空间、适于插入较多的场合)。

另一类就是CArrayXXX之类的动态数组了,它们也相当重要。与描述符数组不同,它们用模板声明元素类型。
CArrayFixFlat<class T> or CArrayFixSeg<class T>,名字中的Fix则 要求元素是定长的对象,可以是T类或者C类。
CArrayPtrFlat<class T> or CArrayPtrSeg<class T>,因为是指针就无所谓元素要求定长了。

而RArray<class T>其实也有同样的要求是定长对象,其实很好理解,除了用指针以外,数组怎么都要求是定长对象放进去。

再次感谢bluepac对我的帮助。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sharetop/archive/2008/03/21/2203450.aspx