Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ B搜索包装器_C++_Templates_Lambda_C++11 - Fatal编程技术网

C++ B搜索包装器

C++ B搜索包装器,c++,templates,lambda,c++11,C++,Templates,Lambda,C++11,不久前,我只是在玩弄搜索算法,在进行了一些基准测试之后,我发现旧的bsearch与std::binary_搜索相比要快得多,这给我留下了深刻的印象。我认为任何一个好的编译器都可以在可能的情况下用bsearch代替std::binary_搜索,但即使我使用的是gcc4.7,bsearch的执行速度似乎是std::binary_搜索的5倍 因此,我认为尝试使用与std::binary_search相同的接口为bsearch创建某种包装器将是一个很好的练习。但不知什么原因,我没能做到。这是我的密码:

不久前,我只是在玩弄搜索算法,在进行了一些基准测试之后,我发现旧的bsearch与std::binary_搜索相比要快得多,这给我留下了深刻的印象。我认为任何一个好的编译器都可以在可能的情况下用bsearch代替std::binary_搜索,但即使我使用的是gcc4.7,bsearch的执行速度似乎是std::binary_搜索的5倍

因此,我认为尝试使用与std::binary_search相同的接口为bsearch创建某种包装器将是一个很好的练习。但不知什么原因,我没能做到。这是我的密码:

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始终等于作为参数传递的选项卡中间的值。我无法找到它为什么不起作用。因此,如果可能的话,一点帮助就可以了

谢谢

对于询问用于检查速度的代码的人:

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;
}
bsearch接受函数指针,而cmp不是函数指针。编辑:我错了。由于cmp不捕获任何变量(括号为空),因此可以将其作为函数指针传递。该行为在C++11标准的§5.1.2/6中有规定

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

B搜索使用函数指针,而cmp不是函数指针。编辑:我错了。由于cmp不捕获任何变量(括号为空),因此可以将其作为函数指针传递。该行为在C++11标准的§5.1.2/6中有规定


bsearch也不会返回比较函数预期返回的正确值。如果键小于数组元素,则返回-1;如果它们相等,则返回0;如果键大于数组元素,则返回1。如果它们不相等,则cmp函数返回0;如果它们相等,则返回1。因此,如果要比较的第一个元素与键不相等,则cmp会使bsearch认为它们相等,并且bsearch会停止,因为它认为它立即找到了正确的元素。

通常,无法使用bsearch实现std::binary\u搜索,因为bsearch只能搜索连续的元素数组,然而,对于任何迭代器类型,std::binary_搜索都适用于一系列迭代器。它可以是一个链表迭代器、一个deque迭代器,或者是用户创建的某个自定义的外来迭代器。显然没有办法用bsearch搜索这些迭代器一般来说,不可能用bsearch实现std::binary_搜索,因为bsearch只能搜索一个连续的元素数组,而std::binary_搜索适用于一系列迭代器,适用于任何迭代器类型。它可以是一个链表迭代器、一个deque迭代器,或者是用户创建的某个自定义的外来迭代器。显然没有办法用bsearch搜索这些迭代器,我很想看看你的测试用例,它显示了5倍的性能差距。那些你命名为InputIterator的需要实现RandomAccessIterator的概念。速度更快,因为cmp对不相等的元素返回intfalse==0。当bsearch看到0时,它认为这意味着相等,并停止搜索。所以bsearch通常认为它很快就找到了元素,而std::binary_search做了一个真正的搜索。哈哈,你这么说我真是太差劲了。我现在就改。如果C++中有一些空间移位操作符,那么它就更容易使用。STD::排序和STD::BiNyLySturk应该比C函数QQuoE和BStk快,因为模板C++算法可以在比较中假设使用了比较器类型而不是比较函数,与在C函数中调用外部函数不同,我希望看到您的测试用例能够证明这5倍的性能差距。您命名为InputIterator的测试用例需要实现RandomAccessIterator概念,因为对于不相等的元素,cmp返回intfalse==0,所以速度更快。当bsearch看到0时,它认为这意味着相等,并停止搜索。所以bsearch通常认为它很快就找到了元素,而std::binary_search做了一个真正的搜索。哈哈,你这么说我真是太差劲了。我现在就改。如果C++中有一些空间移位操作符,那么它就更容易使用。STD::排序和STD::BIANARYL搜索应该比C函数QQuoE和BScript更快,因为模板化C++算法可以
内联比较假设您使用的是比较器类型而不是比较函数,而不是像C函数那样调用外部函数。现在您这么说了,我记得我对bsearch函数的看法是多么错误。但我不知道cmp函数的类型。因为我没有任何编译错误或任何东西,我只是假设类型是正确的。哦,现在你说了,我记得我对bsearch函数的看法是多么错误。但我不知道cmp函数的类型。因为我没有任何编译错误或任何东西,所以我只是假设类型是正确的。