にあるかどうかをテストするために、任意の組み込み関数:Haskellで4私は行うことができRubyで[1,2,3,4](ベクトル)
[1,2,3,4].include?(4) #=>True
私は行うことができます:
4 `elem` [1,2,3,4] #=> True
C++で何をすべきですか?ここで
にあるかどうかをテストするために、任意の組み込み関数:Haskellで4私は行うことができRubyで[1,2,3,4](ベクトル)
[1,2,3,4].include?(4) #=>True
私は行うことができます:
4 `elem` [1,2,3,4] #=> True
C++で何をすべきですか?ここで
正確に機能する組み込み関数はありません。 近くに来る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)) {...}
例使用して検索:
#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;
}
のstd ::正確であることがわかりました:) –
今では完全でなければなりません:) – Burkhard
@forcey、完全にケーニッヒのルックアップ(C++標準3.4.2)による 'find'を修飾する必要はありません。 –
はOPの質問と同様の構文を取得するには:あなたがのstd ::これは、find()メソッドを持って設定し使用することができ
std::vector<int> x;
if (count(x.begin(), x.end(), VAL_TO_FIND)) {
// found
} else {
// not found
}
データ構造全体を反復処理する必要があります。 –
はい、find has = O(n)と同じ複雑さを持ちます。 –
データ構造の内側にインデックス1があることを知りたいときに、100,000個のオブジェクトのデータ構造を反復する理由はありません。 std :: findのベストケースランタイムは、stdのパンツをキックする:データ構造内にオブジェクトが存在するかどうかを調べるためのカウント。すべての場合、findはcountよりも優れているか、または良いです。彼らはそれを使用する理由はありません。 –
。
すべてのコンテナには 'find'メソッドがあります。それはたいてい非会員です。 – jalf
任意のコンテナで使用できるfindアルゴリズムがありますが、std :: setクラスは標準的なセット操作に効率的に設計されています。 たとえば、std :: set :: find()はO(ln(n))を取って値を見つけるのに対して、汎用std :: find()は値を見つけるためにO(n)をとります。 – teambob
STLの哲学は次のように要約することができます:それがメンバーであれば、そのクラスはそのように意図されていたからです。それが非会員の場合は、それが可能なためです。例えば、ランダムなイテレータ( 'operator +')と他のイテレータ( 'std :: advance') – MSalters
ベクトルが順序付けられている場合は、std :: binary_searchも使用できます。
std::binary_search(vec.begin(), vec.end(), 4) // Returns true or false
このコードはコンパイルされていますか? – GRB
理論上。私はそれをテストしていない。 ;) 何の問題がありますか? – jalf
私が見る2つのコンパイルエラーの問題は、コンストラクタと 'operator()'を1回の呼び出しで組み合わせることです( 'contains(x.begin()、x.end()(4)'を実行する必要があります)しかし、 'contains'はファンクタなので、テンプレート型の推論の恩恵を受けません('ベクトル 'を検索していると仮定すると、' contains'を 'contains:: iterator >(...)(...) ')。最後に、論理エラーとして 'find(first、first、val)'ではなく 'find(first、last、val)'が必要です。 –
GRB