首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bsearch包装器

bsearch包装器
EN

Stack Overflow用户
提问于 2012-06-05 23:44:15
回答 2查看 536关注 0票数 1

不久前,我只是在玩搜索算法,经过几个基准测试之后,我看到了旧的bsearch()与std::binary_search()相比有多快,这给我留下了深刻的印象。我认为任何合适的编译器都可以在可能的情况下用bsearch()代替std::binary_search(),但是即使我使用GCC 4.7,bsearch的执行速度似乎比std::binary_search快5倍。

因此,我认为这将是一个很好的练习,尝试用相同的接口(然后是std::binary_search )为bsearch创建某种包装器。但由于一个未知的原因,我没能做到。这是我的密码:

代码语言:javascript
复制
template<typename InputIterator, class T>
bool binary_search(InputIterator first, InputIterator last, const T& value)
{
    auto cmp = [](const void* a, const void* b)
    {
        return (int) ((*(T*)a) == (*(T*)b));
    };

    std::cout << value << std::endl;
    T* res = (T*) bsearch(&value, first, last-first, sizeof(*first), cmp);
    return res != nullptr;
}

代码编译良好,不会在执行时崩溃。但是,似乎bsearch在一次内部迭代之后就停止了(*res总是等于作为参数传递的选项卡中间的值)。我想不出为什么它不起作用。所以,如果可能的话,一点帮助就可以了。

谢谢。

对于那些要求检查速度的代码的人:

代码语言:javascript
复制
const std::string keyword_str[] = {
    // Some strings
};

int cmp(const void* s1, const void* s2)
{
    return (int) ((*(std::string*)s1) == (*(std::string*)s2));
}

int main()
{
    time_t start, end;
    double dif;
    time (&start);

    // Code
    for (const string& str: keyword_str)
    {
        for (size_t i = 0 ; i < 1000000 ; ++i)
        {
            // std::binary_search (uncomment to check)
            //bool a = std::binary_search(keyword_str, keyword_str+28, str);

            // bsearch
            char** st = (char**) bsearch(&str, keyword_str, 28, sizeof(keyword_str[0]), cmp);
        }
    }

    time (&end);
    dif = difftime (end, start);
    printf("Time spent: %fs.\n", dif);

    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 23:59:51

bsearch接受函数指针,而cmp不是函数指针。(编辑:我错了。因为cmp不捕获任何变量--它的括号是空的--它可以作为函数指针传递。此行为在C++11标准第5.1.2/6节中指定)。

bsearch也没有返回期望比较函数返回的正确值。如果键小于数组元素,则返回1;如果键相等,则返回0;如果键大于数组元素,则返回1。如果cmp函数不相等,则返回0;如果它们相等,则返回1。因此,如果您要比较的第一个元素与键不相等,那么您的cmp使bsearch认为它们是相等的,而bsearch停止了,因为它认为它立即找到了正确的元素。

票数 3
EN

Stack Overflow用户

发布于 2012-06-06 03:53:19

通常,不可能使用bsearch实现std::binary_search,因为bsearch只能搜索一个连续的元素数组,而std::binary_search则可以搜索任何迭代器类型的迭代器范围。它可以是链接列表迭代器、deque迭代器,也可以是用户创建的自定义外来迭代器。显然没有办法用bsearch搜索这些迭代器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10906497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档