Symbian OS中的RArray类的排序功能
来源:互联网 发布:unity3d 面部表情 编辑:程序博客网 时间:2024/05/20 19:49
http://blog.yesky.com/351/omakey/1654351.shtml
作者:焰中红叶
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作者的答复里可以给我解释。
- Symbian OS中的RArray类的排序功能
- Symbian OS中的RArray类的排序功能
- Symbian OS中的RArray类的排序功能
- Symbian中的动态集合Rarray的使用
- Symbian OS - RArray和RPointerArray类型
- Symbian OS中的活动对象的使用
- Symbian OS中的活动对象的使用
- Symbian OS下的类命名约定
- Symbian OS的对话框
- Symbian OS中的binary文件
- Symbian基础总结 -- RArray和RPointerArray
- Symbian基础总结 -- RArray和RPointerArray
- Symbian OS 中的Class命名约定(M类)
- RArray
- Symbian OS 的基本数据类型
- Symbian OS 的错误码
- Symbian OS C++ 的优越性
- Symbian OS 中的Class命名约定
- JFace 可编辑的TreeViewer和TableViewer
- 游戏Demos 视频
- Java 的DES算法实现
- Swt/Jface tableViewer入门教程1
- Swt/Jface tableViewer入门教程2
- Symbian OS中的RArray类的排序功能
- Swt/Jface tableviewer入门教程3
- Swt/Jface tableviewer入门教程4
- 全面剖析XMLHttpRequest对象
- Swt/Jface listviewer的实现
- Swt/Jface treeViewer的使用
- 批量数据库拷贝
- 在C#中调用exe文件。
- 为 Eclipse 构建片段扩展