如何使用std :: bsearch的成员函数

时间:2017-10-10 07:42:18

标签: c++ c class bsearch

我有一个C ++类,但我也使用了一些低级C,需要使用bsearch函数。 bsearch的最后一个参数是一个比较函数,我希望以一种允许它访问类的const私有变量的方式实现所述函数。

问题是,如果我将比较函数作为成员函数,它将无法工作,因为它不能转换为常规函数指针。如果我创建一个非成员函数,我可以将它传递给bsearch,但是无法访问该类的私有变量。

怎么办?

例如: enter image description here

3表示有3个元素.16,32,56是偏移​​字节。我需要bsearch来搜索actor。我在偏移数组中搜索。我需要一个比较函数来比较actor但是我也需要const void * actorFile指针用于计算比较函数中的位置.actorFIle是类私有变量。

2 个答案:

答案 0 :(得分:7)

解决方案是放弃C库函数,并使用C ++,因为它意味着要使用。 C ++标准库还具有实用程序搜索功能,它被称为std::lower_bound。它接受类似通用函数的对象,而不仅仅是常规函数指针。

这允许您使用捕获您的类的lambda表达式来调用它:

std::lower_bound(start, finish, value, [this] (auto const& lhs, auto const& rhs) {
                 /* Compare and utilize anything this can point to*/ });

答案 1 :(得分:1)

如果你真的与bsearch绑定,只需在非成员函数中使用你的成员函数。因此,您无需访问私人成员。

/* 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会更好。