C++ STL-Map排序函数

C++ STL-Map sort function

我正在尝试将二进制数据插入到 B 树中,实现 STL 接口。我的类型定义如下:

typedef btree::btree_map<unsigned char*, int, less<unsigned char*>, allocator<unsigned char*>, node_size> Tree;

问题是 less<unsigned char*> 没有像我预期的那样比较元素。

Tree *bt = create_btree();

unsigned char *test = (unsigned char *) malloc(5);
unsigned char *test2 = (unsigned char *) malloc(5);

memset(test, 0, 5);
memset(test2, 0, 5);

cout << "Is equal: " << memcmp(test, test2, 5) << "\n";

memcpy(test + 0, "a[=11=]", 2);
memcpy(test + 2, "HAM", 3);

memcpy(test2 + 0, "a[=11=]", 2);
memcpy(test2 + 2, "HAM", 3);

bt->insert(make_pair(test, 1));
bt->insert(make_pair(test2, 2));

cout << "Is equal: " << memcmp(test, test2, 5) << "\n";


Tree::iterator iter;

for (iter = bt->begin(); iter != bt->end(); iter++) {

    cout << "Data: " << iter->first << " = " << iter->second << "\n";
}

当我 运行 函数 memcmp 上方的代码片段将 return 0 表示两个数组相等但程序的输出是:

Is equal: 0
Is equal: 0
Data: a = 1
Data: a = 2

我希望第二个插入会覆盖第一个,并且只会打印带有 Data: a = 2 的一行。我知道密钥只会打印到 '\0' 出现。所以这里是十六进制表示的关键:'61 00 48 41 4d'。

如果我错了请纠正我,但我认为这与 less 运算符有关。

我的问题是: 有没有办法将 memcmp 之类的函数传递给地图,以便正确比较二进制数组。

提前致谢

I think it has something to do with the less operator.

正确。 less<T*> 函数将比较指针,而不是指针可能指向的数组内容。

Is there a way to pass a function like memcmp to the map in order to compare the binary arrays correct.

是的,请参阅第三个模板参数和第一个构造函数参数。您可以传递自己选择的仿函数(假设 btree::btree_mapstd::map 具有相同的接口)。

我建议使用 std::vectorstd::string 作为键而不是指针。它们不仅与 less<> 一起工作,而且您也不需要管理它们的内存。