2017-02-27 5 views
0

this exampleが最も近いところで、C++でどのようにマップを検索することができるか分かりましたが、まだ助けが必要です。C++で地図を検索するには

私は電話帳のマップを作成しました。

map<string,int> PhBook; 

これで、ユーザーが名前と電話を追加するようになりました。私はしたい何

getline(cin >> ws,name); 
cin >> phone; 
PhBook[name] = phone; 

もマップやプリント「電話= ....」またはそれに応じて「見つかりません」というメッセージで使用可能な名前のためのユーザーの検索をさせることです。

どうすればいいですか?私は初心者であるので、私は最も簡単な解決策を望んでいます。私の難しさは、要素(人名)を使って地図を検索する方法がわからないという事実にあります。見つかった場合は

+4

マップ上の章のC++ブックを開きます。あなたの本は地図の 'find()'メソッドの使い方を説明していると確信しています。 –

+0

'std :: map :: const_iterator result = PhBook.find(input);を使っても構いません。 "result" == PhBook.end()) "cout <<" name not found "<< endl; else cout <<" phone "< second << std :: endl; –

+0

cppreferenceの例は、あなたが尋ねていることをしてくださいそれを理解していないか、実際にしたいことをしていないのですか? –

答えて

2

ここでマップは、そうでない場合、それはあなたがSTL(標準テンプレートライブラリ)マップ内のキーを見つけ達成することができ、複数の方法がありますmap::end

map<string,int> ::iterator it; 
it = PhBook.find(name); 

if (it != PhBook.end()){ 
    cout<<"The phone = "<<it->second<<endl; 
}else{ 
    cout<<"Not found"<<endl; 
} 
0

にイテレータを返し、それにイテレータを返します。 STLライブラリですでに提供されているメソッドを使用することも、独自のメソッドを使用して同じタスクを実行することもできます。私はあなたのソリューションを簡単にするのに役立つヒントをいくつか提供しようとします。

1-)すでに述べたように、std :: Mapのイテレータを定義し、find関数の結果を既に定義されているイテレータに割り当てることができます。しかし、イテレータを宣言することが面倒になることがあります。あなたは今まであなたが上記のタイプのイテレータを定義したいとき、あなたは宣言する必要がありますそのような場合には、ネストされたマップオブジェクト

std::map<std::string, std::map<std::string, int>> dict; 
dict["name"]["phone"] = 1234; 

を定義するために起こる場合たとえば、

std::map<std::string, std::map<std::string, int>>::iterator it = dict.begin(); 

は費やすことイテレータを宣言できるだけの努力は、非常識で時間がかかります。幸運なことに、C++ 11には、コンパイル時に自動的に型を推論するautoキーワードが付いていました。これは私が最も有益な自動キーワードを見つけた唯一の場所です。自動キーワードでは、

auto it = dict.begin(); /*or*/ auto it = dict.find(name) 

すべてが必要です。

2)イテレータは、配列などの1次元の連続したデータ型でポインタが使用されている場合に、ポインタの錯覚を与えます。ただし、STLコンテナはメモリ上で連続してデータを配布することはできません(リンクリスト、バイナリツリーは典型的な例です)。ポインタの算術演算とイテレータの錯覚を与えることは、有用な抽象化である。 C++ 11の範囲ベースのループは、イテレータの代用として適しています。

std::map<std::string, int> dict; 
for(auto & kv : dict){ /* Program logic goes here */ } 

この場合、kvにはキーと値のペアが含まれ、std :: pairのタイプになります。

3-)count標準のメソッドを使用すると、マップ内にキーが存在するかどうかのチェックを行うことができます。 countfindの差がcountの場合は数値を返し、findの場合は反復子を返します。

+0

私は理解に近いです。私が得られなかったのは、map.find(name ) - > second。それは値oを表示します私が必要としていた鍵あなたのソリューションのパート3については、PhBook.count(name)は整数で表示されますか?ブーリアンとして使っている人の例も見つかった。私のコードにいくつかの問題があり、それらを修正するとすぐに最良の答えを更新して選択します。 – Lev

+0

std :: Mapの戻り値の 'count'メソッドはsize_tです。 size_tは、オブジェクトをサイズで表すことができる符号なしの値のエイリアスです(オブジェクトは必ずしもC++オブジェクトである必要はなく、メモリに格納され、変数経由でアクセス可能なものはオブジェクトと呼ばれます)。 size_tの詳細については、この[resource](http://www.embedded.com/electronics-blogs/programming-pointers/4026076/1/Why-size-t-matters)を参照してください。 Bool型は、1と0の値だけを受け取る別の整数型と考えることができます.0より大きいか小さい値は1に変換され、したがってtrueに対応します。 – ugar

関連する問題