2011-10-19 6 views
2

キーとして「仕事」を格納し、値として「名前」を格納するマップがあります。マップ内でのfind()の繰り返しと使用C++

map<string, string>dutyAndJob; 
map<string,string>::iterator it; 

私は基本的に、このマップを特定の「名前」で調べようとしています。 名前がない場合、それはこのループに入るべきではない、しかし、いくつかの未知の理由で、それは常に、このループに入る:

string name = "Bob"; 

it = dutyAndJob.find(name); 
if (it == dutyAndJob.end()) 
{ 
    cout << "Testing : " << name << endl; 
} 

いくつかの理由が、それはまだそこでもかかわらず、このループを入力します。マップに格納されているボブではありません。

ご協力いただければ幸いです!

+0

このコードは、 "Bob"が実際にマップに格納されていなくても "Testing:Bob"を表示します。 – user432584920684

+0

'if'文はループではありません。 – ildjarn

+1

findメンバー関数は**キー**を見つけるためのものです。あなたは "名前"は**値**と言います。 Findはそれを見つけることができません。各項目の値を見て、それが "Bob"かどうかを調べる必要があります。 – UncleBens

答えて

4
if (it == dutyAndJob.end()) 
{ 
    cout << "Testing : " << name << endl; 
} 

は次のようになります。

if (it != dutyAndJob.end()) // Does it refer to a valid association 
{ 
    cout << "Testing : " << name << endl; 
} 

キーがマップで発見されたことを示す!=から==からの変化に注目してください。キーがでない場合、反復子itdutyAndJob.end()に等しいです。が見つかりません。

+0

ご協力ありがとうございます。キーをマップに見つけられなかった場合は、このループを入力するようにしています。だから、私が== – user432584920684

+0

を使ったのは、@Vincent 'dutyAndJob.find()'は名前が見つからなければ 'dutyAndJob.end()'を返します。だから、 'it == dutyAndJob.end()'は、その名前がマップにない*の場合に真となります。 if本体内でコードを実行する場合は、条件を逆にする必要があります。 – nos

+0

@nos it == dutyAndJob.end()は、名前がマップにない場合はtrueです。そのため、名前がマップにない場合(つまり、達成しようとしているもの)ifステートメントを入力したければ、 、私はそれを使用します== dutyAndJob.end();私はしませんか? – user432584920684

0

ちょうどJobがキーであり、Nameがデータであることが分かりました。構造化された方法では、名前を取得するジョブでのみfindを使用できます。

string job = "Cashier"; 

    it = dutyAndJob.find(job); 
    if (it == dutyAndJob.end()) 
    { 
     cout << "Testing : " << job<< endl; 
    } 

実際に名前で検索する場合は、名前がキーで、ジョブがデータである必要がありますか?

関連する問題