在這個例子中,目前還不清楚用什麼樣的數據庫構建db_map
。然而,序列256,1,257,2 ......正好是我期望在小端機器上排序的BTree的序列。
db_map
提供了一個到伯克利DB BTree的接口std::map
。但是,在下面,db_map
的關鍵比較函數由BTree比較函數定義。
從Db::set_bt_compare
documentation:
如果沒有指定的比較功能,按鍵詞彙相比,具有以前更長的密鑰
將數據庫整理較短的鍵,一鍵無非是比一個字節序列。如果未指定密鑰比較功能,則使用memcmp
比較密鑰。如果你想在標準的數字順序進行迭代,分配使用Db::set_bt_compare
一個比較函數:
#include <iostream>
#include <dbstl_map.h>
#include <db_cxx.h>
using namespace dbstl;
int key_compare(DB* db, const DBT* a, const DBT* b, size_t* u)
{
int i,j;
if (0 == a->size || 0 == b->size)
{
return 0;
}
std::memcpy(&i, a->data, sizeof(i));
std::memcpy(&j, b->data, sizeof(j));
return i-j;
}
int main()
{
DbEnv* env = new DbEnv(DB_CXX_NO_EXCEPTIONS);
env->open("/home/centinela", DB_CREATE|DB_INIT_MPOOL, 0);
Db* db = new Db(env, DB_CXX_NO_EXCEPTIONS);
db->set_bt_compare(&key_compare);
db->open(NULL, "test.db", NULL, DB_BTREE, DB_CREATE, 0);
typedef dbstl::db_map<int,std::string> map_type;
map_type* mp = new map_type(db, env);
for (int i = 1; i <= 500; ++i)
{
mp->insert(std::pair<int,std::string>(i,"t"));
}
map_type::const_iterator it;
for (it = mp->begin(); it != mp->end(); ++it)
{
std::cout << it->first << std::endl;
}
delete db;
delete env;
}
請注意,我的例子使用四個參數,從BDB 6.0比較功能。 BDB 5.0的比較函數不包含最後一個參數。見here。