不久前我只是在玩搜索算法,经过几次基准测试后,我对旧的 bsearch() 与 std::binary_search() 相比要快得多感到印象深刻。我认为任何体面的编译器都可以在可能的情况下用 bsearch() 替换 std::binary_search(),但即使我使用的是 GCC 4.7,bsearch 的执行速度似乎比 std::binary_search 快 5 倍。
所以我认为尝试为 bsearch 创建某种包装器与 std::binary_search 相同的接口将是一个很好的练习。但不知什么原因,我没能做到。这是我的代码:
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;
}