2014-02-09 56 views
0

以下是使用db_map的簡單代碼。迭代器循環不返回鍵的順序1,2,3 ... 而是,它返回鍵如256,1,257,2 .....Berkeley Db db_map迭代器不按正確順序循環

unique_ptr> mp = make_unique>();

for (int i = 1; i <= 500; i++) 
    { 
     mp->insert(pair<int, string>(i,"t")); 
    } 

    db_map<int, string>::const_iterator it; 

    for (it = mp->begin(); it != mp->end(); ++it) 
    { 
     cout <<it->first<<endl; 
    } 

回答

0

在這個例子中,目前還不清楚用什麼樣的數據庫構建db_map。然而,序列256,1,257,2 ......正好是我期望在小端機器上排序的BTree的序列。

db_map提供了一個到伯克利DB BTree的接口std::map。但是,在下面,db_map的關鍵比較函數由BTree比較函數定義。

Db::set_bt_comparedocumentation

如果沒有指定的比較功能,按鍵詞彙相比,具有以前更長的密鑰

將數據庫整理較短的鍵,一鍵無非是比一個字節序列。如果未指定密鑰比較功能,則使用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