[解決済み] 役に立つ」C++のバイナリ検索アルゴリズムはどこで手に入りますか?
2022-09-14 04:28:25
質問
C++のSTLコンテナと互換性のあるバイナリ検索アルゴリズムが必要で、以下のようなものです。
std::binary_search
のような、標準ライブラリの
<algorithm>
ヘッダがありますが、要素が存在するかどうかを示す単純なブール値ではなく、結果を指し示すイテレータを返す必要があります。
(余談ですが、binary_searchのAPIを定義したとき、標準委員会は一体何を考えていたのでしょうか?!)
ここでの私の主な関心事は、バイナリ検索の速度が必要なことです。したがって、後述のように他のアルゴリズムでデータを見つけることができますが、線形検索ではなくバイナリ検索の利点を得るために、私のデータがソートされているという事実を利用したいと思います。
ここまで
lower_bound
と
upper_bound
は、datumが欠落している場合は失敗します。
//lousy pseudo code
vector(1,2,3,4,6,7,8,9,0) //notice no 5
iter = lower_bound_or_upper_bound(start,end,5)
iter != 5 && iter !=end //not returning end as usual, instead it'll return 4 or 6
注意
コンテナと互換性がある限り、std名前空間に属さないアルゴリズムを使っても構わないと思います。例えば
boost::binary_search
.
どのように解決するのですか?
このような関数はありませんが、簡単なものは
std::lower_bound
,
std::upper_bound
または
std::equal_range
.
簡単な実装は
template<class Iter, class T>
Iter binary_find(Iter begin, Iter end, T val)
{
// Finds the lower bound in at most log(last - first) + 1 comparisons
Iter i = std::lower_bound(begin, end, val);
if (i != end && !(val < *i))
return i; // found
else
return end; // not found
}
別の解決策としては
std::set
というメソッドで、要素の順序を保証することができます。
iterator find(T key)
を提供し、与えられた項目へのイテレータを返します。しかし、あなたの要件はセットの使用と互換性がないかもしれません(例えば、同じ要素を複数回保存する必要がある場合など)。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】C++の余分な資格エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】'cout'は型名ではない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較