How to use a member function with std::bsearch
我有一个C ++类,但我也使用一些低级C,需要使用bsearch函数。 bsearch的最后一个参数是一个比较函数,我希望以一种允许它访问类的const私有变量的方式实现所述函数。
问题是,如果我将比较函数作为成员函数,它将无法工作,因为它不能转换为常规函数指针。 如果我创建一个非成员函数,我可以将它传递给bsearch,但是无法访问该类的私有变量。
该怎么办?
例:
3意味着有3个元素.16,32,56是偏移字节。我需要bsearch来搜索actors.I我在偏移数组中搜索。我需要一个比较函数来比较actor但我也需要const void * actorFile 用于计算比较函数中位置的指针.actorFIle是类私有变量。
-
@StoryTeller感谢您快速回复。使用纯粹的bsearch是不是可以完成?我还快速了解了lower_bound,它还需要一个cmp函数,在这种情况下,它与bsearch有什么不同?
-
std::lower_bound可以使用任何类型的函子(一个函数,或者定义了operator()的对象,包括lambdas)。使用对象,您可以保存进行比较所需的任何变量。
-
如果您为私人会员提供吸气剂,您的比较功能可以是免费功能。如果您需要访问私有成员,则可以从课外访问私有成员,将其公开或提供访问它的方法
-
@ tobi303 - 免费功能仍然需要该类的实例。使用bsearch,必须求助于全局变量。那是一种气味。
-
@StoryTeller我不明白,"免费功能仍然需要一个类的实例"? free函数是int compare(const void*,const void*),实例作为参数传递。顺便说一句,我没有尝试使用bsearch进行辩护
-
@ tobi303 - 正如我所看到的,OP的问题是他们的类在某些低级别C上调用bsearch。不是说bsearch用于对类实例进行排序(这将是非常糟糕的)。
-
@StoryTeller啊好吧,好像我误解了这个问题
-
@ tobi303 - 实际上,你的观点让我觉得我可能误解了它。我修正了问题的措词,但可能仍不清楚。
-
@StoryTeller没有代码,总是很难说...
-
请提供最小的可重复示例。问题不是100%明确。你想搜索什么?为什么你认为你需要访问私人会员?
解决方案是放弃C库函数,并使用C ++,因为它意味着要使用。 C ++标准库还有一个实用程序搜索功能,它叫做std::lower_bound。 它接受类似通用函数的对象,而不仅仅是常规函数指针。
这允许您使用捕获您的类的lambda表达式来调用它:
1 2
| std::lower_bound(start, finish, value, [this] (auto const& lhs, auto const& rhs) {
/* Compare and utilize anything this can point to*/ }); |
-
使用lower_bound会更好,但我真的很喜欢bsearch。
-
@ sparrow2 - 我真的不知道怎么样。 bsearch仅适用于普通数组,lower_bound也适用于普通C数组。
-
@ sparrow2你不能吃蛋糕吃。 bsearch是一个C函数,它对类和成员函数一无所知。
-
@StoryTeller我在偏移上运行bsearch,在示例16,32,56中,但在比较函数中我比较实际信息,这就是为什么我需要actorFile来计算真实信息的位置。
-
@ sparrow2 - 你的帖子没有例子,它有一张图和一些挥动的手。 一个恰当的例子(一个可重复性最小的例子)。 将有一个示例C和C ++代码,显示您尝试执行的操作。 我们不会猜测如何帮助你。 你必须告诉我们。
如果你真的与bsearch绑定,只需在非成员函数中使用你的成员函数。 因此,您无需访问私有成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /* Create global variable to use in compare proc*/
actors_data_base* cmp_data_base = NULL;
/* Write compare routine like */
int cmp_proc(const void * a, const void * b)
{
size_t a_offset = static_cast<size_t>(a);
size_t b_offset = static_cast<size_t>(b);
return cmp_data_base->compare_actors(a_offset, b_offset);
}
/* Set global pointer and use bsearch */
actors_data_base = &my_data_base;
bsearch(&my_value, array, size, sizeof(size_t), cmp_proc); |
当然,由于使用了全局变量,这很难看。 但这是传递上下文来比较proc的唯一方法。 您可以考虑使用线程本地存储来避免线程问题(由于全局变量,cmp_proc不能同时使用)
因此,使用std::lower_bound会更好。
-
编译器不会让我在类文件中的非成员函数中使用成员函数,如果我没有实例并调用该实例的成员方法
-
让我澄清一下。 我将添加一个例子。