数组2

转自:http://blog.youkuaiyun.com/sharetop/archive/2008/03/21/2203450.aspx

TFixedArray
它是最类似于我们平时使用的数组,从概念上或者从使用上都非常类似。

// 声明
TFixedArray < TGridCell, 81 > iGrid;

// 使用
void CSuDoScAppView::InitGrid()
... {
for (TInti = 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 (TIntj = 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()
... {
RFilefile;
TBuf8
< 4 > bufC4;
TBuf8
< 81 > bufC81;

if (KErrNone == file.Open(iFs,KTiDataFile,EFileRead))
... {
file.Read(bufC4,
4 );
TUintlen
= ((TUint)bufC4[ 3 ] << 24 ) + ((TUint)bufC4[ 2 ] << 16 ) + ((TUint)bufC4[ 1 ] << 8 ) + (TUint)bufC4[ 0 ];

for ( int i = 0 ;i < len;i ++ ) ... {
TQuestionti;
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 (TInti = 0 ;i < 81 ;i ++ )ti.data[i] = bufC81[i];
iList.Append(ti);
}

file.Close();
}


}


除了在析构函数中需要iList.Close()以外,事先不需要做什么初始化工作,一个个的Append进去就可以了。它也重载了运算符[],可以简单地访问其中的元素。

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

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

// 声明
RPointerArray < CFbsBitmap > iThumbNormal;

// 使用
for (TInti = 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 (TInti = 0 ;i < 9 ;i ++ ) ... {
deleteiThumbNormal[i];
deleteiThumbNormalMask[i];

}

iThumbNormal.Close();


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

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

补充说明一下:

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

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>其实也有同样的要求是定长对象,其实很好理解,除了用指针以外,数组怎么都要求是定长对象放进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值