1

標準のバイナリ検索機能がどのように実装されているか知っている人はいますか?

これが原型です。

void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *) );

彼らが void ポインターをどのように使用したかについて、私は本当に興味があります。

4

3 に答える 3

3

実際の二分探索アルゴリズム自体ではなく、でvoid *ポインタがどのように使用されるかを知りたいと思います。bsearchのプロトタイプbsearchは次のとおりです。

void *bsearch(const void *key, const void *base,
    size_t nmemb, size_t size,
    int (*compar)(const void *, const void *));

ここでvoid *は、任意のタイプを検索できるように使用されます。ポインターの解釈は、(ユーザー提供の)compar関数によって行われます。

ポインターbaseは配列の先頭を指し、配列の要素は連続していることが保証されているため、ポインター演算を実行することにより、配列内の任意の要素へbsearchのポインターを取得できます。たとえば、配列の5番目の要素へのポインタを取得するには(仮定):void *nmembnmemb >= 5

unsigned char *base_p = base;
size_t n = 5;
/* Go 5 elements after base */
unsigned char *curr = base_p + size*n;
/* curr now points to the 5th element of the array.
   Moreover, we can pass curr as the first or the second parameter
   to 'compar', because of implicit and legal conversion of curr to void *
   in the call */

上記のスニペットでは、タイプがであり、算術演算が定義されていないため、にsize*n直接追加できませんでした。basevoid *void *

于 2010-01-13T09:05:49.960 に答える
1

のさまざまな実装については、bsearch @ Google の codesearchを参照してくださいbsearch

于 2010-01-03T03:07:51.700 に答える
-1

ソースを見てください。VS Standard 以上を使用している場合は、次を参照してください。

C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\bsearch.c

于 2010-01-03T03:03:16.873 に答える