Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++ 在bsearch()中自定义比较_C++_Bsearch - Fatal编程技术网

C++ 在bsearch()中自定义比较

C++ 在bsearch()中自定义比较,c++,bsearch,C++,Bsearch,我有一个指向整数(这些整数)的地址数组 按升序排序)。它们有重复的值。例:1,, 2,2,3,3,3,3,4,4 我正试图掌握所有比a更大的价值观 特定值(键)。目前正在尝试使用二进制实现它 搜索算法- void *bsearch( const void *key, const void *base, size_t num, size_t width, int ( __cdecl *compare ) ( const void *, const void *) ); 我不能完全做到这

我有一个指向整数(这些整数)的地址数组 按升序排序)。它们有重复的值。例:1,, 2,2,3,3,3,3,4,4

我正试图掌握所有比a更大的价值观 特定值(键)。目前正在尝试使用二进制实现它 搜索算法-

void *bsearch(
 const void *key,
 const void *base,
 size_t num,
 size_t width,
 int ( __cdecl *compare ) ( const void *, const void *)
);
我不能完全做到这一点,但对其中一些人来说

有没有其他方法来掌握所有的价值观 数组,而不更改我使用的算法?

您应该查看

例如,要查找第一个大于3的值的地址:

const int data[] = { 1, 2, 2, 3, 3, 3, 3, 4, 4, ... };
size_t data_count = sizeof(data) / sizeof(*data);

const int *ptr = std::upper_bound(data, data + data_count, 3);

// ptr will now point to the address of the first 4

相关函数是。

是的,您可以使用二进制搜索。诀窍是当您找到具有给定键的元素时所做的。。。除非上下索引相同,否则需要在间隔的左侧继续二进制搜索。。。也就是说,应该将上限移动到当前中点。这样,当二进制搜索终止时,您将找到第一个这样的元素。然后只需迭代其余部分。

正如Klatchko和GMan所指出的那样,STL函数给出的正是您想要的:

但是,如果您需要坚持使用bsearch,最简单的解决方案可能是向前迭代,直到达到一个新值

void* p = bsearch(key, base, num, width, compare);
while ((p != end) &&           // however you define the end of the array - 
                               // base + num, perhaps?
       (compare(key, p)==0)){  // while p points to an element matching the key

   ++p; // advance p
}
如果您想得到与键匹配的第一个p,而不是第一个更大的p,只需使用
--p
而不是
++p

正如Michael所建议的,您是喜欢这种搜索还是重复的二进制搜索,这取决于数组的大小和您期望的重复次数


现在,您的问题标题指的是自定义比较函数,但据我所知,这个问题在这里对您没有帮助-比较函数必须将任意两个等效对象作为等效对象进行比较,因此识别几个等效对象中的哪一个是数组中其类型的第一个/最后一个是不好的。除非您有不同的问题,特别是关于比较函数的问题?

如果您实现了一个二进制搜索树,那么您就有相应的算法。您可以到达所需的“上限”节点,然后从那里按顺序进行遍历。遍历比多次搜索树要简单,也就是说,遍历一棵由n个节点组成的树最多需要n次操作,而搜索n次则需要(n.log n)次操作。

也许您受到了限制,但标准库具备所有这些功能。另一个相关函数是std::equal_range。结果表明,我是反向读取的。。。因此,只需执行相反的操作,找到具有给定键的最后一个元素,然后迭代所有后续元素。不!我没有实现二进制搜索树:(我不允许使用std::lower_bound或类似的东西。我会尝试你建议的!!!!对于混淆的标题,我很抱歉。我所做的只是,检查是否有任何其他数组元素与键匹配,而不是比较函数找到的第一个键…-这不是一个好主意!!!