代替手段は何ですか?
自分で書くべきですか?
std::find()
イテレータ範囲で線形探索を実行するアルゴリズムがあります。
std::vector<int> v;
// Finds the first element in the vector that has the value 42:
// If there is no such value, it == v.end()
std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 42);
ベクトルが並べ替えstd::binary_search()
られている場合は、値がベクトルに存在するかどうかをテストし、std::equal_range()
その値を持つベクトル内の要素の範囲に対してイテレータを開始および終了するために使用できます。
ない理由vector::find
は、アルゴリズム上の利点がないためです(std::find
一般的に、ベクトルに対してより良い結果を出すことはできません)。std::find
O(N)
しかし、あなたが持っている理由map::find
は、それがより効率的である可能性map::find
があるためです(したがって、マップO(log N)
には常にそれを使用したいと思うでしょう)。std::find
誰があなたにそれを言ったの?vector
C++には「検索」アルゴリズムがあります。皮肉なことに偶然にも、それはと呼ばれていstd::find
ます。または多分std::binary_search
。または、ベクターに格納されているデータのプロパティに応じて、他の何か。
コンテナは、アルゴリズムの効果的な実装が何らかの形でコンテナの内部詳細に関連付けられている場合にのみ、独自の特定のバージョンの汎用アルゴリズム(コンテナメソッドとして実装)を取得します。std::list<>::sort
一例です。
他のすべての場合、アルゴリズムはスタンドアロン関数によって実装されます。
を使用しstd::find(vec.begin(), vec.end(), value)
ます。
そして、含めることを忘れないでください <algorithm>
代替手段は何ですか?
この標準は、同様の要素(またはそのようなもの)の任意のシーケンスを順次検索するためのstd::findを提供します。
これは、イテレータをサポートするすべてのコンテナに適用できますが、内部的にソートされたコンテナ(などstd::map
)の場合、検索を最適化できます。その場合、コンテナは独自のfind
メンバー関数を提供します。
なぜC++でベクトルが見つからないのですか?
std::vector<???>::find
実装はと同じであるため、を作成しても意味がありませんでしたstd::find(vector.begin(), vector.end(), value_to_find);
。
自分で書くべきですか?
いいえ。特定の制限や要件がない限り、可能な限りSTL実装を使用する必要があります。