Berkeley Db db_map迭代器没有正确的循环

时间:2014-02-09 17:36:28

标签: berkeley-db

以下是使用db_map的简单代码。迭代器循环不按顺序1,2,3返回键... 相反,它返回键,如256,1,257,2 .....

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

1 个答案:

答案 0 :(得分:0)

在这个例子中,不清楚用什么类型的数据库构建db_map。但是,序列256,1,257,2 ...正好是我对小端机器上memcmp排序的BTree所期望的序列。

db_map为Berkeley 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