12

代替手段は何ですか?

自分で書くべきですか?

4

6 に答える 6

46

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()その値を持つベクトル内の要素の範囲に対してイテレータを開始および終了するために使用できます。

于 2010-06-08T00:27:20.190 に答える
26

ない理由vector::findは、アルゴリズム上の利点がないためです(std::find一般的に、ベクトルに対してより良い結果を出すことはできません)。std::findO(N)

しかし、あなたが持っている理由map::findは、それがより効率的である可能性map::findがあるためです(したがって、マップO(log N)には常にそれを使用したいと思うでしょう)。std::find

于 2010-06-08T00:30:46.260 に答える
8

誰があなたにそれを言ったの?vectorC++には「検索」アルゴリズムがあります。皮肉なことに偶然にも、それはと呼ばれていstd::findます。または多分std::binary_search。または、ベクターに格納されているデータのプロパティに応じて、他の何か。

コンテナは、アルゴリズムの効果的な実装が何らかの形でコンテナの内部詳細に関連付けられている場合にのみ、独自の特定のバージョンの汎用アルゴリズム(コンテナメソッドとして実装)を取得します。std::list<>::sort一例です。

他のすべての場合、アルゴリズムはスタンドアロン関数によって実装されます。

于 2010-06-08T00:30:42.710 に答える
4

を使用しstd::find(vec.begin(), vec.end(), value)ます。

そして、含めることを忘れないでください <algorithm>

于 2010-06-08T00:28:09.377 に答える
4

コンテナクラスに「検索」機能があると、「SRP」(単一責任原則)に違反します。コンテナのコア機能は、コンテナ内の要素の保存、取得のためのインターフェイスを提供することです。「検索」、「並べ替え」、「反復」などは、どのコンテナーのコア機能でもないため、コンテナーの直接インターフェースの一部ではありません。

ただし、「Herb」が名前空間の原則で述べているように、「find」は「vector」と同じ名前空間、つまり「std」で定義されることにより、インターフェースの一部です。

于 2010-09-19T06:22:31.110 に答える
3

代替手段は何ですか?

この標準は、同様の要素(またはそのようなもの)の任意のシーケンスを順次検索するためのstd::findを提供します。

これは、イテレータをサポートするすべてのコンテナに適用できますが、内部的にソートされたコンテナ(などstd::map)の場合、検索を最適化できます。その場合、コンテナは独自のfindメンバー関数を提供します。

なぜC++でベクトルが見つからないのですか?

std::vector<???>::find実装はと同じであるため、を作成しても意味がありませんでしたstd::find(vector.begin(), vector.end(), value_to_find);

自分で書くべきですか?

いいえ。特定の制限や要件がない限り、可能な限りSTL実装を使用する必要があります。

于 2010-06-08T09:06:03.600 に答える