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_map
与 std::map
具有相同的接口)。
我建议使用 std::vector
或 std::string
作为键而不是指针。它们不仅与 less<>
一起工作,而且您也不需要管理它们的内存。
我正在尝试将二进制数据插入到 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_map
与 std::map
具有相同的接口)。
我建议使用 std::vector
或 std::string
作为键而不是指针。它们不仅与 less<>
一起工作,而且您也不需要管理它们的内存。