2009-08-23 8 views

答えて

8

正確に機能する組み込み関数はありません。 近くに来るstd::findがありますが、それはboolを返さないので、使用するのが少し厄介です。

あなたはいつも(常にシーケンス全体を横断する)が、countを使用せず、JIa3epの提案に似た構文を取得するには、独自のロールできます

template <typename iter_t> 
bool contains(iter_t first, iter_t last, typename iter_t::value_type val){ 
    return find(first, last, val) != last; 
} 

次に、あなたは、単にそれを使用するには、この操作を行うことができます。

std::vector<int> x; 

if (contains(x.begin(), x.end(), 4)) {...} 
+0

このコードはコンパイルされていますか? – GRB

+0

理論上。私はそれをテストしていない。 ;) 何の問題がありますか? – jalf

+0

私が見る2つのコンパイルエラーの問題は、コンストラクタと 'operator()'を1回の呼び出しで組み合わせることです( 'contains(x.begin()、x.end()(4)'を実行する必要があります)しかし、 'contains'はファンクタなので、テンプレート型の推論の恩恵を受けません('ベクトル 'を検索していると仮定すると、' contains'を 'contains:: iterator >(...)(...) ')。最後に、論理エラーとして 'find(first、first、val)'ではなく 'find(first、last、val)'が必要です。 – GRB

20

例使用して検索:

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
     std::vector<int> Num(4); 
     //insert values 
     Num[0]=1; 
     Num[1]=2; 
     Num[2]=3; 
     Num[3]=4; 
     std::vector<int>::iterator p = find(Num.begin(), Num.end(), 4); 
     if (p == Num.end()) 
      std::cout << "Could not find 4 in the vector" << std::endl; 
     else 
      std::cout << "Have found 4 in the vector" << std::endl; 
     return 0; 
} 
+2

のstd ::正確であることがわかりました:) –

+0

今では完全でなければなりません:) – Burkhard

+1

@forcey、完全にケーニッヒのルックアップ(C++標準3.4.2)による 'find'を修飾する必要はありません。 –

1

はOPの質問と同様の構文を取得するには:あなたがのstd ::これは、find()メソッドを持って設定し使用することができ

std::vector<int> x; 

if (count(x.begin(), x.end(), VAL_TO_FIND)) { 
// found 
} else { 
// not found 
} 
+2

データ構造全体を反復処理する必要があります。 –

+1

はい、find has = O(n)と同じ複雑さを持ちます。 –

+3

データ構造の内側にインデックス1があることを知りたいときに、100,000個のオブジェクトのデータ構造を反復する理由はありません。 std :: findのベストケースランタイムは、stdのパンツをキックする:データ構造内にオブジェクトが存在するかどうかを調べるためのカウント。すべての場合、findはcountよりも優れているか、または良いです。彼らはそれを使用する理由はありません。 –

0

+0

すべてのコンテナには 'find'メソッドがあります。それはたいてい非会員です。 – jalf

+2

任意のコンテナで使用できるfindアルゴリズムがありますが、std :: setクラスは標準的なセット操作に効率的に設計されています。 たとえば、std :: set :: find()はO(ln(n))を取って値を見つけるのに対して、汎用std :: find()は値を見つけるためにO(n)をとります。 – teambob

+0

STLの哲学は次のように要約することができます:それがメンバーであれば、そのクラスはそのように意図されていたからです。それが非会員の場合は、それが可能なためです。例えば、ランダムなイテレータ( 'operator +')と他のイテレータ( 'std :: advance') – MSalters

2

ベクトルが順序付けられている場合は、std :: binary_searchも使用できます。

std::binary_search(vec.begin(), vec.end(), 4) // Returns true or false