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>,可能是爲了提高效率吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章