?? cmxbtree 類使用說明.txt
字號:
CMXBTree 類使用說明
=============================================================
1、概述
-------
CMXBTree 的主要作用是在內(nèi)存中建立一棵B+樹,主要針對數(shù)據(jù)
量較大,查詢頻繁的數(shù)據(jù),例如話單分離中局向的查詢、配置文件
中的設置查詢等。總之,CMXBTree 可被視作一個在內(nèi)存中的數(shù)據(jù)庫
使用。其特點是:短小精悍。
2、使用 CMXBTree 類
-------------------
CMXBTree 被定義為一個模板(C++ Template),定義格式是:
CMXBTree< RECTYPE > bt;
例如,如果要想 定義一個 int 的 B+Tree 可寫作:
CMXBTree< int > btInt;
注意:模板中的 RECTYPE 必須支持兩個操作符:
小于(<) 和 賦值(=)
3、CMXBTree 所支持的方法
------------------------
[1]、增加樹中的元素
int InsertKey( RECTYPE &Key );
入口參數(shù)是要插入的 元素 的引用,主要目的是為了`快`。
返回值:
0 表示正常
-1 表示 B+Tree 出錯,即 CMXBTree 有 BUG
-2 申請不到內(nèi)存,內(nèi)存不足
[2]、刪除樹中的元素
int DeleteKey( RECTYPE &Key );
入口參數(shù)是要刪除的 元素 的引用,主要目的是為了`快`。
返回值:
1 表示要刪除的 Key 不在樹中
0 表示正常刪除
-1 表示 B+Tree 出錯,即 CMXBTree 有 BUG
[3]、在樹中搜索某個 Key
RECTYPE *SearchKey( RECTYPE & Key,
RECTYPE **pLessThan = NULL,
RECTYPE **pGreaterThan = NULL
);
入口參數(shù):
Key:要查找的 Key 的引用
pLessThan: 當該參數(shù)不為 NULL 時,不管能不能在樹中找到Key
它返回比 Key 小的元素中最大的一個元素的指針,如果
這個指針是 NULL,表示 Key 在樹中的值最小,沒有
別的元素比它小。
pGreaterThan: 當該參數(shù)不為 NULL 時,不管能不能在樹中找到Key
它返回比 Key 大的元素中最小的一個元素的指針,如果
這個指針是 NULL,表示 Key 在樹中的值最大,沒有
別的元素比它大。
返回值:
如果樹中存在于 Key 的值相等的元素,則返回該元素的指針,
否則,返回 NULL
[4]、繼續(xù)搜索具有同樣 Key 的元素(與SearchKey配合使用)
RECTYPE *SearchNextKey( void );
當我們使用 SearchKey 查找到一個滿足條件的元素后,可以用該方法
繼續(xù)搜索下一個符合同樣條件的元素。由于采用了隊列,該方法的返回
將`飛快`。
返回值:與 SearchKey 相同
[5]、無條件返回樹中的第一個元素(也就是樹中最小的元素)
RECTYPE *GetFirstKey( void );
返回值:指向樹中的第一個元素的指針,如果是 NULL,表示該樹已空。
[6]、無條件返回樹中的下一個元素(與 GetFirstKey 配合使用)
RECTYPE *GetNextKey( void );
這個方法所返回的元素一定是從小到大排列的。
返回值:指向樹中的第一個元素的指針,如果是 NULL,表示該樹已空。
[7]、把數(shù)砍掉
int DestroyTree( void )
把數(shù)連根拔起、釋放內(nèi)存
返回值
0 表示正常
-1 表示 B+Tree 出錯,即 CMXBTree 有 BUG
4、使用例子
-----------
//先定義一棵樹,元素類型是:CMXString
//注:CMXString 是我定義的一個專門處理字符串的類
// 它支持 小于操作符(<) 和 賦值操作符(=)
CMXBTree<CMXString> bt;
//定義需要的變量及指針
CMXString str2, str, *pStr, *pStr1, *pStr2;
//這是局向
char* pszStr = " 8517 8519 8610 8611 8615 8620 8625 8630 8635 "
"8640 8645 8650 8655 8660 8665 8540 8541 8542 "
"8670 8672 8675 8677 8682 8684 8686 8621 "
"8690 8691 8692 8693 8694 8697 85186";
str = pszStr;
str2 = str.GetFirstToken(" "); //以空格為分隔符,把 pszStr 一個個地切開
while( !str2.IsEmpty() ) //如果還沒有到字符串的末尾
{
if( str2.Length() > 0 ) //如果兩個空格間有東西,
bt.InsertKey( str2 ); //把 str2 插入
str2 = str.GetNextToken( ); //取下一個局向
}
//來到這里表示樹已建成
//接下來,我們把樹的所有元素按照從小到大的順序排列出來
pStr = bt.GetFirstKey();
while( pStr )
{
printf("[%s]", pStr->C_str() );
pStr = bt.GetNextKey();
}
printf("\n");
//看看字符串 "85186" 是否存在
str2 = "85186";
pStr = bt.SearchKey( str2, &pStr1, &pStr2 );
if( pStr )
printf("[%s] is in the tree\n", *pStr );
else
printf("Cannot find [%s]\n", *pStr );
//看看電話號碼 8677123 是否在這個局中
str2 = "8677123"
pStr = bt.SearchKey( str2, &pStr1, &pStr2 );
if( pStr1 )
{
if( pStr1 && str2.FindFirst( *pStr1 ) == str2 ) //*pStr1 應該就是 8667
printf("Yes!\n");
}
//如果 pStr1 為 NULL ,表示 str2 比所有的局向數(shù)據(jù)小,
//則表示 str2 一定不在局向內(nèi)
這段代碼的輸出結果將是:
[8517][85186][8519][8540][8541][8542][8610][8611][8615][8620][8621][8625][8630][
8635][8640][8645][8650][8655][8660][8665][8670][8672][8675][8677][8682][8684][86
86][8690][8691][8692][8693][8694][8697]
[85186] is in the tree
Yes!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -