C ++ STL-Map排序函数

时间:2015-02-02 15:21:29

标签: c++ stl

我试图将二进制数据插入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之类的函数传递给地图,以便比较正确的二进制数组。

提前感谢

1 个答案:

答案 0 :(得分:2)

  

我认为这与较少的运营商有关。

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

  

有没有办法将memcmp这样的函数传递给地图,以便比较正确的二进制数组。

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

我建议使用std::vectorstd::string作为键而不是指针。它们不仅适用于less<>,而且您也不需要管理它们的记忆。