C++ 替换类似STL映射中的值
我对映射的btree实现(从)有问题。我的代码如下:C++ 替换类似STL映射中的值,c++,C++,我对映射的btree实现(从)有问题。我的代码如下: Tree*bt=create_btree(); 无符号字符*测试=(无符号字符*)malloc(5); 无符号字符*test2=(无符号字符*)malloc(5); memset(测试,0,5); memset(test2,0,5); memcpy(测试+0,“a\0”,2); memcpy(测试+2,“火腿”,3); memcpy(test2+0,“a\0”,2); memcpy(测试2+2,“FRA”,3); (*bt)[测试]=659;
Tree*bt=create_btree();
无符号字符*测试=(无符号字符*)malloc(5);
无符号字符*test2=(无符号字符*)malloc(5);
memset(测试,0,5);
memset(test2,0,5);
memcpy(测试+0,“a\0”,2);
memcpy(测试+2,“火腿”,3);
memcpy(test2+0,“a\0”,2);
memcpy(测试2+2,“FRA”,3);
(*bt)[测试]=659;
(*bt)[test2]=999;
(*bt)[测试]=350;
int值;
无符号字符*键;
迭代器iter;
对于(iter=bt->begin();iter!=bt->end();iter++){
键=国际热核实验堆->第一;
数值=国际热核实验堆->秒;
printf(“键:”);
寄存器int i;
对于(i=0;i<5;i++)
printf(“%02x”,(int)键[i]);
printf(“;值:%d\n”,值);
}
CPPUNIT_ASSERT_EQUAL(2,(int)bt->size());
Tree::iterator it=bt->find(test);
value=(*it);
CPPUNIT_ASSERT_EQUAL(350,值);
正如最后一行代码所示,我希望value
为350,因为我将test
的值从659
更改为350
。此外,地图中应该只有两个元素,但输出如下:
键:610048414D;价值:659
关键词:6100465241;数值:999
关键词:610048414D;价值:350
我向树传递一个自己实现的比较函数来对元素进行排序:
struct cmpBinary{
布尔运算符()(无符号字符*a,无符号字符*b)常量{
//d_尺寸为5
bool cmp=memcmp(a、b、d_尺寸);
返回cmp;
}
};
/*类型定义*/
typedef btree::btree_映射树;
我的问题是,为什么第一个元素数据不会被值350
替换?一个有趣的事实是,如果我删除行(*bt)[test2]=999
并直接在第一个元素之后插入“第三个”(现在是第二个)元素,输出与预期一样
键:610048414D;价值:350
提前感谢。
memcmp
如果内存区域相等,则返回0
,否则,如果第一个较小,则返回负值;如果第二个较大,则返回正值。当我们检查树映射的模板定义时,我们会看到:
template <typename Key, typename Value,
typename Compare = std::less<Key>,
typename Alloc = std::allocator<std::pair<const Key, Value> >,
int TargetNodeSize = 256>
memcmp
如果内存区域相等,则返回0
,否则,如果第一个区域较小,则返回负值;如果第二个区域较大,则返回正值。当我们检查树映射的模板定义时,我们会看到:
template <typename Key, typename Value,
typename Compare = std::less<Key>,
typename Alloc = std::allocator<std::pair<const Key, Value> >,
int TargetNodeSize = 256>
memcmp
如果内存区域相等,则返回0
,否则,如果第一个区域较小,则返回负值;如果第二个区域较大,则返回正值。当我们检查树映射的模板定义时,我们会看到:
template <typename Key, typename Value,
typename Compare = std::less<Key>,
typename Alloc = std::allocator<std::pair<const Key, Value> >,
int TargetNodeSize = 256>
memcmp
如果内存区域相等,则返回0
,否则,如果第一个区域较小,则返回负值;如果第二个区域较大,则返回正值。当我们检查树映射的模板定义时,我们会看到:
template <typename Key, typename Value,
typename Compare = std::less<Key>,
typename Alloc = std::allocator<std::pair<const Key, Value> >,
int TargetNodeSize = 256>
我得用布尔。否则,btree库的编译将失败。使用
您自己的less版本是什么意思。我仍然可以使用上面的代码吗?我的意思是,如果第一个参数小于第二个参数,那么默认的比较器将返回。是的,以上是一个有效的less实现OK。因此需要一个函数,如果第一个元素较小,则返回该函数;如果第二个参数较小、相等或较大,则不需要返回该函数。酷。我想我明白了。谢谢你的帮助,我得用bool。否则,btree库的编译将失败。使用您自己的less版本是什么意思。我仍然可以使用上面的代码吗?我的意思是,如果第一个参数小于第二个参数,那么默认的比较器将返回。是的,以上是一个有效的less实现OK。因此需要一个函数,如果第一个元素较小,则返回该函数;如果第二个参数较小、相等或较大,则不需要返回该函数。酷。我想我明白了。谢谢你的帮助,我得用bool。否则,btree库的编译将失败。使用您自己的less版本是什么意思。我仍然可以使用上面的代码吗?我的意思是,如果第一个参数小于第二个参数,那么默认的比较器将返回。是的,以上是一个有效的less实现OK。因此需要一个函数,如果第一个元素较小,则返回该函数;如果第二个参数较小、相等或较大,则不需要返回该函数。酷。我想我明白了。谢谢你的帮助,我得用bool。否则,btree库的编译将失败。使用您自己的less版本是什么意思。我仍然可以使用上面的代码吗?我的意思是,如果第一个参数小于第二个参数,那么默认的比较器将返回。是的,以上是一个有效的less实现OK。因此需要一个函数,如果第一个元素较小,则返回该函数;如果第二个参数较小、相等或较大,则不需要返回该函数。酷。我想我明白了。谢谢你的帮助。