しばらく前に検索アルゴリズムをいじっていたところ、いくつかのベンチマークを行った後、古いbsearch()がstd :: binary_search()と比較してどれだけ高速であるかを確認したことに感銘を受けました。適切なコンパイラであれば、可能な場合はstd :: binary_search()をbsearch()に置き換えることができると思いましたが、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は1回の内部反復の直後に停止するようです(* 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;
}