2014-02-09 9 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 ...는 리틀 엔디안 컴퓨터에서 memcmp 정렬 된 BTree를 기대하는 시퀀스입니다.

db_map은 Berkeley DB BTree에 대한 std::map 인터페이스를 제공합니다. 그러나 아래에서 db_map에 대한 키 비교 함수는 BTree 비교 함수에 의해 정의됩니다. Db::set_bt_comparedocumentation에서

: 더 비교 함수가 지정되지 않은 경우

는, 키가 짧은 키가 더 이상 키

데이터베이스에

전에 조합과, 어휘 비교, 핵심은 아무것도 더있다 바이트의 순서보다. 키 비교 기능을 지정하지 않으면 memcmp이 키를 비교하는 데 사용됩니다. 내 예를 들어 네 개의 매개 변수가 BDB 6.0에서 비교 기능을 사용

#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; 
} 

참고 : 표준 숫자 순서대로 반복 할 경우, Db::set_bt_compare를 사용하여 비교 기능을 할당 할 수 있습니다. BDB 5.0의 비교 함수는 마지막 매개 변수를 포함하지 않습니다. here을 참조하십시오.