Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 替换类似STL映射中的值_C++ - Fatal编程技术网

C++ 替换类似STL映射中的值

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;

我对映射的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;
(*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。因此需要一个函数,如果第一个元素较小,则返回该函数;如果第二个参数较小、相等或较大,则不需要返回该函数。酷。我想我明白了。谢谢你的帮助。