質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3727閲覧

c++:mapに格納された要素を全て表示したい

yusuke-fusegi

総合スコア39

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/03 06:28

c++のmapに関する質問です。

#include<iostream> #include<map> using namespace std; int main(void){ map<string,int>m; int n; string str; cin>>n; for(int i=0;i<n;i++){ cin>>str>>m[str]; } for(auto const&answer:m){ cout<<answer.first<<" "<<answer.second<<endl; } return 0; }

文字列とそれに対応する数字を入力し、それをmapで格納し最後にそれぞれの第一要素と第二要素を全て表示するプログラムを作るために上記のようなコードを書いたのですが、上手く全表示することが出来ません。
自分なりに調べてはみたのですが改善策が分からずじまいになってしまったため、どなたか分かる方に改善策を教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++

1#include <iostream> 2#include <map> 3#include <string> 4 5int main(void){ 6 using namespace std; 7 8 map<string,int>m; 9 int n; 10 cin>>n; 11 for(int i=0;i<n;i++){ 12 string key; 13 int val; 14 cin >> key >> val; 15 m[key] = val; 16 } 17 for ( auto const& answer : m ) { 18 cout << answer.first << " " << answer.second << endl; 19 } 20 21 return 0; 22}

[追記]
cin >> str >> m[str] だと cin >> str によって str が書き換わる前に
m[str] が評価されてると推察されます。その検証:

C++

1#include <iostream> 2#include <string> 3 4std::string key; 5int val; 6 7int& foo(const char* str) { 8 key = str; // 引き渡された文字列をコピーののち 9 return val; // val の参照を返す 10} 11 12int main(void){ 13 using namespace std; 14 char buffer[64] = "ABRACADABRA"; 15 cin >> buffer >> foo(buffer); 16 cout << "key =[" << key << "]\n"; // foo() に引き渡された文字列 17 cout << "val =[" << val << "]\n"; 18}

実行結果

abc 3 ← 入力 key =[ABRACADABRA] val =[3]

たしかに。
※ Windows/Visual C++ 2019 での結果です。

投稿2020/08/03 06:33

編集2020/08/03 23:53
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yusuke-fusegi

2020/08/03 06:43

全表示できました!ありがとうございました!
episteme

2020/08/03 06:52

cin>>str>>m[str]; こいつを cin >> str; cin >> m[str]; とするんでもよかったかな...
fana

2020/08/03 06:52

OK,それでは,私から問うておこう. 元のコードの書き方 (cin>>str>>m[str];)だと何故ダメなんでしょうか?
yusuke-fusegi

2020/08/05 07:14 編集

>>fana様 cin>>m[str]だとmapの第二要素をint型として格納できないからでしょうか?
episteme

2020/08/03 07:06

いや、m[str] は int& を返すから cin >> m[str] に問題はないはず。 cin >> str >> m[str] だと cin >> str によって str が書き換わる 前に m[str] が評価されてると推察されます。
fana

2020/08/03 08:57

> str が書き換わる前に m[str] が評価されてる 動作を見るとそんな感じですね. (cin>>str)>>m[str]; とかしても変わらない模様.
yohhoy

2020/08/04 06:22 編集

C++17で仕様修正された、下記ページの内容が関係していますね。 https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html ある程度新しい GCC(g++) や Clang(Clang++) では、この修正が適用されるようです。 コンパイラの対応バージョンを気にするくらいなら、cin >> str; cin >> m[str]; と2文で書くのが無難ではあります。
yusuke-fusegi

2020/08/05 05:48

バージョンによっては質問の際私が投稿したソースコードでも問題なく動かせるということでしょうか? 色々な方に教えていただいて、今後はmapの第一要素と第二要素を入力してからそれをmapとして定義するように書いた方が無難だと感じたのですが。
yohhoy

2020/08/05 06:05 編集

> バージョンによっては質問の際私が投稿したソースコードでも問題なく動かせるということでしょうか? はい。新しいC++コンパイラ(正確にはC++17仕様に厳格に対応したコンパイラ)では、質問中のソースコードで期待通り動作します。 > 今後はmapの第一要素と第二要素を入力してからそれをmapとして定義するように書いた方が無難だと感じた シンプルなコードを書いた方が無難というのは、同意見です。  cin >> str;  cin >> m[str]; とするか  cin >> key >> val;  m[key] = val; とするかは好みの問題ですね。
episteme

2020/08/05 05:55

[追記]した検証コード、Visual C++ 2019 で -std:c++17 オプション付けたら 期待(思惑?)通りの挙動になりました。
yusuke-fusegi

2020/08/05 07:14

>>yohhoy様、episteme様 バージョンが変わっても動かせるようにコーディングする意識は今までなかったので、大変勉強になりました!お二方ともありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問