2011-10-26 17 views
2

私は、文字列が可能な例のように少しラインの配列に存在するかどうかを確認しようとしている:Javascriptの「in」のC++に相当するものは何ですか?

string foo[] = {blah,blahhh,blahhhh} 
string bar = "blah"; 

if (bar in foo){ 
cout << "true"; 
}else { 
cout << "false"; 
} 
+1

タイトルをよりわかりやすくしました。私が言語を間違えた場合は、それを修正してもどうぞ。 –

+1

**何もありません**一部には、JavaScriptの 'in'があなたが行っていると信じていることをしていないので、間違って使用されています* ;-) *本当に必要なものを尋ねます*それに別の言葉を持ち込むこと。私は質問を書き直すつもりだったが、私はそれを捨て*してやり直さなければならなかった。 –

+0

良い点。 'in'は値ではなくキーを探します。 –

答えて

2

C++では、このキーワードもこの構文もありません。 ループを実行するか、find関数を使用する必要があります。同じことをしようと、他の人のために

http://www.cplusplus.com/reference/algorithm/find/

(多くの人々が過去に私に尋ねた質問であるため):char配列や文字列リテラル(定数char型の配列である)にすることはできません等価性や組込み演算子と比較して:2つのcharリテラルを比較することは、2つのポインタを比較することと同じです。 ただし、std :: string型を使用することも、strcmpのような古いCスタイルの関数を使用することもできます。

あまりにも多くの行のコードを書くことを避けたいのであれば、より多くの行を持つ別の関数を書いて1行で呼び出すだけです。その後、素敵なヘッダファイルに入れて、あなたの代わりに、配列を使用すると、uはパラメータとしてサイズを渡すことができる機能を使用する必要がありますポインタを持っている場合は、:)

#include <iostream> 
#include <string> 

using namespace std; 

template<typename T, size_t N> 
inline bool arraycontains(const T (&array)[N], const T& value) 
{ 
    for (size_t i = 0; i < N; ++i) 
     if (array[i] == value) 
      return true; 
    return false; 
} 

int main() 
{ 
    string foo[] = { "blah", "blahhh", "blahhhh" }; 
    string bar = "blah"; 

    cout << (arraycontains(foo, bar) ? "true" : "false"); 
    return 0; 
} 

が必要なときにそれを含めることができます。

配列が本当に大きい場合、配列にO(n)線形検索を使用したいとは思いません。この場合、std :: mapまたはstd :: hash_map(hash_mapはSTLのすべてのバージョンで利用可能ではありません)。

std :: mapはRed Black Tree(または実装に応じてAVLツリー)を内部的に使用するため、ルックアップ操作はO(log n)最悪の場合、O(n)より高速です。

代わりにstd :: hash_mapは内部的にハッシュテーブルを使用して、現実世界のアプリケーションでは最悪の場合の複雑さO(n)が平均複雑度O(1)を提供します。

+0

すでにテンプレートを使用している場合は、配列のサイズも推測してみましょう。そして、テンプレートはすでにインラインになっています。コンパイラはそれを把握させてください。'template bool arraycontains(const T(&array)[N]、const T&value){} ' –

+0

ああ、この恐ろしい' cin.get() 'ハックを伝播しないでください!周囲の環境を望ましく振る舞わせることは、このプログラムの仕事ではありません。 –

+0

コメントありがとう!提案通りに修正されました! –

0

ません演算子。あなたはそれを探すために関数を使わなければなりません。あなた自身で書くか(Cスタイルの配列のメンバーを参照)、またはSTLコンテナとalgorithmsを使用してください。

+0

...またはあなたにリンクされたもののような標準ライブラリ相当品! –

0

文字列が見つかったときにbreak文を使用してforループを使用します。

2

組み込み演算子がありません。 C++はJavascriptよりも低レベルなので、あなたはこれらのものを自分で構築する必要があります。

幸いなことに、標準ライブラリには、この作業を行うためのアルゴリズムが用意されています。

あなたのCスタイルの配列の開始と終了を取得するためにC++11 rangesを使用した:

std::string foo[] = {"lol", "stack", "overflow"}; 
std::string bar = "stack"; 

if (std::find(std::begin(foo), std::end(foo), bar) != std::end(foo)) 
    found(); 
else 
    not_found(); 

これらの範囲がなければ、手動で配列の開始と終了を提供します。

std::string foo[] = {"lol", "stack", "overflow"}; 
std::string bar = "stack"; 

if (std::find(foo, foo+3, bar) != foo+3) 
    found(); 
else 
    not_found(); 

または、より良いをまだ、ベクトルを使用する(と私はここでC++ 11の初期化に使用しました)

std::vector<std::string> foo{"lol", "stack", "overflow"}; 
std::string bar = "stack"; 

if (std::find(foo.begin(), foo.end(), bar) != foo.end()) 
    found(); 
else 
    not_found(); 

^私はこれがstd::array/boost::arrayでも動作すると信じています。これは、Cスタイルの配列であなたの例と直接的に類似しています。

0

あなたは標準コンテナのために簡単に使用できますが、プレーンな配列で少ない非働く、std::findを使用する必要があります。

string *end = foo + sizeof foo/sizeof *foo; 
if (std::find(foo, end, bar) != end) { 
    std::cout << "found"; 
} else { 
    std::cout << "not found"; 
} 

あなたがstd::vectorとして、適切なコンテナを使用していた場合、あなたが使用できます。

if (std::find(foo.begin(), foo.end(), bar) != foo.end()) 

これは、アレイの問題から少しの魔法を取り除きます。

0

C++にはこのような演算子がありません。あなたのような何かをしなければならないでしょう:CおよびCでは

bool containsBar = false; 
for(int i = 0; i < 3; i++) { 
    if(foo[i] == bar) { // need to use strcmp or something here, just put == for simplicity. 
     cout << "true"; 
     containsBar = true; 
     break; 
    } 
} 
if(!containsBar) 
    cout << "false"; 
+0

**注:**直接のアナログは成功条件であなたが「中断」することを要求します。 –

+0

ブレークは本当に必要なわけではありませんが、パフォーマンス上の理由から常に良いです。バーが巨大な配列の最初の要素であるという可能性を考えれば、時間を大幅に節約することができます。私はその投稿に追加しました。 – CuddleBunny

+1

OPのプログラムのセマンティクスを維持する必要があります。複数の一致が見つかった場合に 'cout <<" true "'が1回だけ実行されます。 –

0

を++が本当に特定のキーワードではありません

「で」おそらく最も簡単な方法は、この

のようなループを作ることであるために(?)
bool isInsideArray = false; //by default isInsideArray is false 
for (int counter = 0;counter>(sizeof(foo)/sizeof(foo[0]));counter++) //find the amount of elements in the array by finding the size of the whole array divided by the size of one element 
{ 
    if (foo[counter] == bar) // check if bar is equal to the current foo element 
    { 
    isInsideArray = true; //set isInsideArray to true 
    break; // break from the loop so we don't do any unnessecary procceessing 
    } 
} 
if(isInsideArray) // if bar was encountered inside foo 
{ 
    //code to be done if bar is inside foo 
} 
else // isInsideArray equals false 
{ 
    //otherwise 
} 

それはバールに等しいかどうこれを行う この(referrinように真と出口

にフラグを設定するフラグがtrueに設定されている場合、アレイとチェックの各要素をループif文の内部コードにグラム)

そうでない場合は、この(elseステートメント内のコードを参照)

これは(最も簡単な方法は...私が知っているからである操作を行う)

希望このことができます

+0

sizeof(foo)/ sizeof(foo [0])を使用できるように、配列内の文字列オブジェクトは常に同じサイズですか? – CuddleBunny

+0

@CuddleBunny、どういう意味ですか...それはまさに私のコードにあるものです – luckyl

+0

配列 "{" dog "、" pickle "、" cat "}を持っていれば、sizeof" dog "ピクルが大きければ問題? – CuddleBunny

関連する問題