我试图将二进制数据插入B树,实现STL接口。我的typedefinition如下:
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\0", 2);
memcpy(test + 2, "HAM", 3);
memcpy(test2 + 0, "a\0", 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
将返回0,表示两个数组相等,但程序的输出为:
Is equal: 0
Is equal: 0
Data: a = 1
Data: a = 2
我希望第二个插入会覆盖第一个插入,只打印一行Data: a = 2
。我知道钥匙只会打印到&#39; \ 0&#39;发生。所以这里是十六进制表示的键:`61 00 48 41 4d&#39;。
如果我错了,请纠正我,但我认为这与less
运营商有关。
我的问题是:
有没有办法将memcmp
之类的函数传递给地图,以便比较正确的二进制数组。
提前感谢
答案 0 :(得分:2)
我认为这与较少的运营商有关。
正确。 less<T*>
函数将比较指针,而不是它们可能指向的数组内容。
有没有办法将memcmp这样的函数传递给地图,以便比较正确的二进制数组。
是的,请参阅第三个模板参数和第一个构造函数参数。您可以传递自己选择的仿函数(假设btree::btree_map
具有与std::map
相同的界面。)
我建议使用std::vector
或std::string
作为键而不是指针。它们不仅适用于less<>
,而且您也不需要管理它们的记忆。