Symbian OS中的RArray类的排序功能

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作者的答复里可以给我解释。

时间: 2024-12-31 05:31:04

Symbian OS中的RArray类的排序功能的相关文章

使用PHP4中的 IntegratedTemplate类实现BLOCK功能

使用PHP 模板类进行编程很有好处,但是有时也会碰到一个问题,比如说输出一个表格,但是表格行数要到运行的时候才知道,如留言板.BBS.购物网站之类,经常会碰到这个问题.这时做美工的人无法决定在HTML文件中用几行表格,如果在PHP代码文件中写循环输出,又会让美工.PHP程序员看代码都不方便,美工的人会说,这里的表格哪里去了?我要修改表格的颜色背景之类怎么办?PHP程序员也会说,怎么这里突然有一个<tr>.<td>,做什么用?会嵌在HTML文件哪里?. 使用PHP模板类编程一般把这种

Symbian OS开发初级手册7 Descriptors

Symbian OS 中不使用我们所熟悉的c 字符串(char*) 或者c++ 的string. Symbian 的字符串是通过descriptor实现的.我们的第一个Symbian 程序,文字版Helloworld中是这样使用的: _LIT(KHelloWorldText,"Hello world!n"):console->Printf(KHelloWorldText):_LIT()是一个宏,它声明了一个descriptor:KHelloWorldText,其内容是"

Symbian OS基本数据类型

Symbian OS使用的是面向对象的C++,但是又和标准的C++有一些区别.比如Symbian OS没有标准的异常处理(Exception),因为设计Symbian OS的时候还C++还没有把异常处理标准化.所以Symbian设计了自己得异常处理机制: TRAP, leave.另外就是今天要讲的基本类型.Symbian 基本上不使用任何标准的C++基本类型,众所周知,不同的C++编辑器对int, unsigned int的长度理解不同,所以Symbian OS中使用 TInt8,TInt16,

WINFORM中绑定对象支持排序功能

在很久很久以前,DataSet操作是.Net中的一个重要使用手段,其实现在也是 . 在很久很久以前,我的项目操作方式是通过数据Fill一个DataSet,之后返回 给业务层做处理,之后给页面去显示. 随着时间积累,越来越不喜欢DataSet,我记得有人跟我说DataTable比 DataSet效率高,我不反驳也不认同,不知道. 我只知道DataSet如果不做任何处理在WebService上传输效率极其低下. 之后的编程模式中引入了对象的概念.至于对象的好处,在此不做论述. 这篇文章主要表述不是对

用C语言实现从文本文件中读取数据后进行排序的功能_C 语言

功能介绍 程序的功能是从外部读取一个包括int型数据的文本文件,然后将它保存到内部临时数组,对数组进行排序后,以文本形式输出到指定的文件上.因为是int类型的数据,没有很严重的损失精度的问题. 正常运行要求: 包括数据的源文件内不能包括其他任何除数字和空白字符(空格,制表符,换行符)之外的任何字符,源文件最开始必须是数字字符,要保证源文件的数据计数正确.同时保证文件名有效. 运行结果 data.txt: obj.txt: 完整代码 警告:版权所有,谨供参考! #include <stdio.h>

java中List按照指定字段排序工具类

文章标题:java中List按照指定字段排序工具类. 文章地址: http://blog.csdn.net/5iasp/article/details/17717179   包括如下几个类   1. 实体类   package com.newyear.wish; /** * 实体类 * */ public class Video { public Video(int id, String title, int hits) { super(); this.id = id; this.title =

编程-数组类模板Array,类中包括对数组进行排序、查找和求元素和 然后由此产生模板类Array&amp;amp;lt;Box&amp;amp;gt;

问题描述 数组类模板Array,类中包括对数组进行排序.查找和求元素和 然后由此产生模板类Array<Box> #include using namespace std;class Box{private: int a b c;public: int V; Box(int chint kint g) { a = ch; b = k; c = g; V = a*b*c; } bool operator <(Box &one) { int temp = V - one.V; if (

Symbian编程总结-基础篇-类类型

原文出自:http://discussion.forum.nokia.com/forum/showthread.php?t=68969 译自Developer Library » Symbian OS Guide » Essential idioms » Class types 概要 Symbian OS上的应用程序使用4种常用的类,它们是: 以T开头的值类,这种类不拥有任何外部对象,只是通过指针直接引用或通过句柄间接引用外部对象. 以C开头的基于堆分配的类,这种类全部是从CBase派生过来的.

写给symbian os开发初学者的技巧

1.没有人强迫你,是你志愿选择了symbian os.2.这是最重要的问题,开发symbian 平台的软件到底有没有前途呢?每个symbian os的开发者都在考虑这个的问题,答案很简单,问问市场就知道了,只要你做的是精品,肯定会得到认可的.全球每年生产几亿部手机 ,如果都装有你写的软件,我想成就感要比win平台上的程序员自豪多了,前途嘛你自己说呢? 3.Symbian os 程序员应必备的素质=程序员应必备的素质+创新+市场意识. 4.关于开发环境最好使用vc.net 和 vc6来搭配,因为V