名前空間
変種
操作

std::bsearch

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
bsearch
数値演算
未初期化メモリに対する操作
 
ヘッダ <cstdlib> で定義
void* bsearch( const void* key, const void* ptr, std::size_t count,

               std::size_t size, /* c-compare-pred */* comp );
void* bsearch( const void* key, const void* ptr, std::size_t count,

               std::size_t size, /* compare-pred */* comp );
(1)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(2) (説明用*)

key が指す要素と同じ要素を、ptr が指す配列から検索します。この配列は count 個の要素を持ち、各要素は size バイトです。配列は key が指すオブジェクトに対してパーティション化されている必要があります。つまり、key より小さい要素はすべて key と等しい要素の前に、それらは key より大きい要素の前に配置されていなければなりません。完全にソートされた配列はこれらの要件を満たします。要素の比較には、comp が指す関数が使用されます。

配列が、comp が使用するものと同じ基準で、key に対して昇順にパーティション化されていない場合、動作は未定義です。

comp が検索対象の要素と等しいと示す要素が配列内に複数存在する場合、関数が結果としてどの要素を返すかは未指定です。

目次

[編集] Parameters

key - 検索する要素へのポインタ
ptr - 検査する配列へのポインタ
count - 配列内の要素数
size - 配列内の各要素のバイト単位のサイズ
comp - 比較関数。最初の引数が2番目の引数より小さい場合は負の整数値、大きい場合は正の整数値、同等の場合はゼロを返します。key が最初の引数として、配列の要素が2番目の引数として渡されます。

比較関数のシグネチャは、以下と同等でなければならない。

 int cmp(const void *a, const void *b);

この関数は、渡されたオブジェクトを変更してはならず、同じオブジェクトに対して呼び出された場合、配列内の位置に関係なく一貫した結果を返さなければなりません。

[編集] Return value

見つかった要素へのポインタ。要素が見つからなかった場合はヌルポインタ。

[編集] Notes

名前に反して、C標準やPOSIX標準では、この関数がバイナリ検索を使用して実装されることや、複雑さの保証があることは要求されていません。

C++標準ライブラリによって提供される2つのオーバーロードは、パラメータ comp の型が異なる(その型の言語リンケージが型の一部である)ため、区別されます。

[編集] Example

#include <array>
#include <cstdlib>
#include <iostream>
 
template<typename T>
int compare(const void *a, const void *b)
{
    const auto &arg1 = *(static_cast<const T*>(a));
    const auto &arg2 = *(static_cast<const T*>(b));
    const auto cmp = arg1 <=> arg2;
    return cmp < 0 ? -1
        :  cmp > 0 ? +1
        :  0;
}
 
int main()
{
    std::array arr{1, 2, 3, 4, 5, 6, 7, 8};
 
    for (const int key : {4, 8, 9})
    {
        const int* p = static_cast<int*>(
            std::bsearch(&key,
                arr.data(),
                arr.size(),
                sizeof(decltype(arr)::value_type),
                compare<int>));
 
        std::cout << "value " << key;
        if (p)
            std::cout << " found at position " << (p - arr.data()) << '\n';
        else
            std::cout << " not found\n";
    }
}

出力

value 4 found at position 3
value 8 found at position 7
value 9 not found

[編集] See also

型が指定されていない要素の範囲をソートする
(関数) [編集]
特定のキーに一致する要素の範囲を返す
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)