yaodong

yaodong
随笔 - 20, 评论 - 367, 引用 - 53

导航

标签

每月存档

最新留言

广告

 

RArray类,属于symbian OS提供的基础容器类,并且是比较重要和常用的一个。

如果从名字来看这是一个数据类,功能貌似和 MFC的CArray,stl的vector差不多吧?
如果这么想就错了,RArray是个泛型数组容器类,但是功能比CArray vector 提供的要多。

尤其是他提供的排序和查找功能,其实现方法比较诡异,对初学者来说容易造成迷惑。
个人认为这个设计比较蹩脚,至于为什么会这样,我想不出,已经写信给作者咨询了,不过还没得到答复。

RArray的排序是这样的,它规定数组中每个元素可以有一个 order key,这个order key其实就是数组元素的某4个字节
至于具体是哪4个字节作为order key是由key offset决定的,key offset 是构造函数的参数,是可选的,默认为0

就是说,默认情况下,数组里面每个元素的前4个字节会被用来作为排序的key。
因此RArray也规定,每个元素至少要有4个字节,并且大小必须是4个倍数,否则某些函数不能用,甚至会产生异常。

比如我们声明一个 结构体 Bar 作为数组的元素,然后构建一个Bar的数组 barArray

struct Bar
{
   TInt  iId;
   TInt  iSize;
}

RArray<Bar> barArray;

于是 iId就会成为order key了,因为默认情况下key offset 为0,iId就是元素的头4个字节。
如果你要用isize做order key,那么只要指定key offset为4就好了。

如果需要RArray的排序功能那么 你就需要用到一系列名字中带有KeyOrder的函数比如 InsertInSignedKeyOrderL,FindInSignedKeyOrderL等等

Insert操作时,会按照插入元素的order key排序来查找合适的Insert位置。
Find时,也是比较order key,由于查找时只比较order key,所以会写出这样有点诡异的代码
比如我们要查找 iId 为 100的元素的位置
Bar foo;
foo.iId = 100;
TInt index = barArray.InsertInSignedKeyOrderL(foo);
查找条件中的 iSize没有初值?对没有,也没必要,因为InsertInSignedKeyOrderL只比较前4个字节
iSize用不到,所以也不用给初值。

注意 函数名中的 Signed,还有与之对应的 Unsigned,这些表示比较order key的时候是否考虑符号。
就是order key是 当作TInt还是TUint来比较。

如果你不用这些带有KeyOrder的系列函数,那么和一个CArray的数组基本一样。

另外 RArray有2个特化版本,RArray<TInt>,RArray<TUint>,可能是为了提高效率吧。

现在我明白Symbian 里为什么没有 list map 等容器类了,RArray实在是一专多能。
不过我还是认为这样的设计不够优雅,也许作者有苦衷?希望RArray作者的答复里可以给我解释。

打印 | 张贴于 2007-03-29 17:13:00 | Tag:随便聊聊

留言反馈

#回复: Symbian OS中的RArray类的排序功能 编辑
强烈鄙视“谷歌”............................................
2008-01-04 09:12:00 | [匿名用户:试卷]
#回复: Symbian OS中的RArray类的排序功能 编辑
好文章 写的好 收下
2007-10-25 10:53:00 | [匿名用户:dhc]
#回复: Symbian OS中的RArray类的排序功能 编辑
写得太好了 好文章
2007-10-25 10:53:00 | [匿名用户:征途私服]
#回复: Symbian OS中的RArray类的排序功能 编辑
好文章 写的好
2007-10-25 10:52:00 | [匿名用户:dhc]
#回复: Symbian OS中的RArray类的排序功能 编辑
好文章
2007-10-25 10:51:00 | [匿名用户:dhc]
#回复: Symbian OS中的RArray类的排序功能 编辑
很好,很强大!!有点不太敢相信了
2007-10-23 13:16:00 | [匿名用户:新开传世私服]
#回复: Symbian OS中的RArray类的排序功能 编辑
很好,很强大!!
2007-10-23 13:15:00 | [匿名用户:新开传世私服]
#回复: Symbian OS中的RArray类的排序功能 编辑
谢谢 不知道当初是否这个设计初衷

2007-10-19 06:19:00 | [匿名用户:小游戏]
#回复: Symbian OS中的RArray类的排序功能 编辑
有点不太敢相信了 不知道楼主自己试过没有
2007-10-19 06:18:00 | [匿名用户:picasa]
#回复: Symbian OS中的RArray类的排序功能 编辑
有点不太敢相信了
2007-10-19 06:17:00 | [匿名用户:picasa]
#回复: Symbian OS中的RArray类的排序功能 编辑
不好意思 我就是上面那个 言语不当 见谅了
2007-09-29 18:57:00 | [匿名用户:DHC]
#回复: Symbian OS中的RArray类的排序功能 编辑
未必吧 不知道作者实践过没有
2007-09-29 18:56:00 | [匿名用户:火狐]
#回复: Symbian OS中的RArray类的排序功能 编辑
如果类型定义是这样
class CTest
{
int ivalue;
virtual void show();
};
那么就一定要使用key offset啦吧
2007-08-08 10:31:00 | [匿名用户:lulu]
#回复: Symbian OS中的RArray类的排序功能 编辑
[url=http://www.57sun.com]奇迹世界[/url]也不错
2007-07-29 15:02:00 | [匿名用户:fefef]
#回复: Symbian OS中的RArray类的排序功能 编辑
2007-07-29 15:02:00 | [匿名用户:fefef]
#回复: Symbian OS中的RArray类的排序功能 编辑
,不知道当初是否这个设计初衷
2007-07-21 15:01:00 | [匿名用户:火狐]
#回复: Symbian OS中的RArray类的排序功能 编辑
这样做甚至比qsort()函数还搞特殊化,不过速度肯定是最好的,因为它连callback都不需要调用:排序查找最多的操作就是值比较,一个int的比较的开销比一次函数调用小多了,不知道当初是否这个设计初衷.

2007-07-21 15:00:00 | [匿名用户:火狐]
#回复: Symbian OS中的RArray类的排序功能 编辑
速度的确是最好的。
2007-07-21 14:59:00 | [匿名用户:火狐]
#回复: Symbian OS中的RArray类的排序功能 编辑
速度的确是最好的。好东西应该分享

2007-07-21 14:59:00 | [匿名用户:火狐]
#回复: Symbian OS中的RArray类的排序功能 编辑
速度的确是最好的。
2007-04-01 16:44:00 | [匿名用户:监控软件]
#回复: Symbian OS中的RArray类的排序功能 编辑
速度的确是最好的,连callback都不需要。
2007-04-01 16:44:00 | [匿名用户:监控软件]
#回复: Symbian OS中的RArray类的排序功能 编辑
好东西应该分享
2007-04-01 03:16:00 | [匿名用户:六合彩]
#回复: Symbian OS中的RArray类的排序功能 编辑
六合是好东西应该分享
2007-04-01 03:16:00 | [匿名用户:六合彩]
#回复: Symbian OS中的RArray类的排序功能 编辑
分析的很对。
2007-03-29 18:08:00 | [匿名用户:firefox]
#回复: Symbian OS中的RArray类的排序功能 编辑
这样做甚至比qsort()函数还搞特殊化,不过速度肯定是最好的,因为它连callback都不需要调用:排序查找最多的操作就是值比较,一个int的比较的开销比一次函数调用小多了,不知道当初是否这个设计初衷.
2007-03-29 17:57:00 | [匿名用户:helixapp]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.1.8