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

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

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

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

Q&A

2回答

638閲覧

AtcoderABC 282 C問題 C++における連想配列の扱い

nekura.3k

総合スコア0

C++

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

0グッド

0クリップ

投稿2022/12/18 15:09

前提

AtcoderABC282のC問題に関する質問です。
公式放送(Youtube)の模範解答で連想配列を用いていたので、連想配列に格納された値を確かめようとした際以下のエラーメッセージが発生しました。

実現したいこと

連想配列のvalueとキーを出力したい

発生している問題・エラーメッセージ

エラーメッセージ ./Main.cpp: In function ‘int main()’: ./Main.cpp:17:16: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘std::vector<int>’) 17 | cout << itr->second << endl; | ~~~~ ^~ ~~~~~~~~~~~ | | | | | std::vector<int> | std::ostream {aka std::basic_ostream<char>} In file included from /usr/include/c++/9/istream:39, from /usr/include/c++/9/sstream:38, from /usr/include/c++/9/complex:45, from /usr/include/c++/9/ccomplex:39, from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:54, from ./Main.cpp:1: /usr/include/c++/9/ostream:108:7: note: candidate: ‘std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]’ 108 | operator<<(__ostream_type& (*__pf)(__ostream_type&)) | ^~~~~~~~ /usr/include/c++/9/ostream:108:36: note: no known conversion for argument 1 from ‘std::vector<int>’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&)’ {aka ‘std::basic_ostream<char>& (*)(std::basic_ostream<char>&)’} 108 | operator<<(__ostream_type& (*__pf)(__ostream_type&)) | ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

該当のソースコード

C++

1ソースコード 2 3 #include <bits/stdc++.h> 4using namespace std; 5#define rep(i,n) for (int i = 0; i < (n); ++i) 6 7int main() { 8 int n; 9 cin >> n; 10 vector<int> x(n), y(n); 11 rep(i,n) cin >> x[i] >> y[i]; 12 string s; 13 cin >> s; 14 map<int,vector<int>> mp; 15 rep(i,n) { 16 mp[y[i]].push_back(i); //連想配列に格納された値を知りたい 17 } 18 for(auto itr=mp.begin(); itr!=mp.end(); itr++) { 19 cout << itr->second << endl; //itr->firstのときは作動したがitr->secondだとエ        ラー発生 20 } 21 22 23 return 0; 24}

試したこと

itr->firstのときは作動したがitr->secondだとエラー発生
また標準入力において入力例1のとおり

3
2 3
1 1
4 1
RRL

と入力し、itr->firstとしてプログラムを実行すると、

1
3

と出力された。
この1と3が何を意味するのかも分からない。
この問題はy[i]において等しい値を見つけることが初めのステップとなっている。
となれば1,3ではなく1,2と出力されなければおかしいのではないかと思ってしまう。
またmp[y[i]].push_back(i)で何を行っているのかを教えてくれると助かります。

補足情報(FW/ツールのバージョンなど)

c++(GCC 9.2.1)

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

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

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

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

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

episteme

2022/12/18 17:07

> itr->secondだとエラー発生 理由はエラー・メッセージに書いてありますが....
guest

回答2

0

ABC282 の問題ではなく ABC243 の問題ですね… 見た人が困りますので、正しく記載してください。サイトへのリンクを貼るとグッドです。

C - Collision 2 - https://atcoder.jp/contests/abc243/tasks/abc243_c


この問題では、それぞれの人は左右どちらかに動くので、衝突する可能性があるのは同じy座標にいる人同士ですね。そのため、keyを「y座標」、valueを「y座標がkeyである人の番号を並べた配列」とする連想配列を使い、N人をy座標の値によってグループ分けしています。

mp[y[i]].push_back(i)は、「y[i] = i番目の人のy座標」をkeyとするvalueの配列に、「i = i番目の人の番号そのもの」を追加しているというわけです。

さて、mapの表示方法についてですが、itr->secondつまりmapのvalueの型はvector<int>であり、C++ではこれを直接coutで表示する方法は用意されていません。for文を使い、各要素を表示するようにしましょう。

c++

1#include <bits/stdc++.h> 2using namespace std; 3#define rep(i,n) for (int i = 0; i < (n); ++i) 4 5int main() { 6 int n; 7 cin >> n; 8 vector<int> x(n), y(n); 9 rep(i,n) cin >> x[i] >> y[i]; 10 string s; 11 cin >> s; 12 map<int,vector<int>> mp; 13 rep(i,n) { 14 mp[y[i]].push_back(i); 15 } 16 for(auto itr=mp.begin(); itr!=mp.end(); itr++) { 17 cout << itr->first << ": {"; //firstはint型なので直接表示できる 18 rep(i,itr->second.size()) { //secondはvector<int>型なのでfor文(rep)で各要素を表示する 19 cout<< itr->second[i] <<", "; 20 } 21 cout<<"}\n"; 22 } 23 return 0; 24}

入力例1ですと、出力はこのようになります。

1: {1, 2, } 3: {0, }

これを見ると、y座標が1である人は2番と3番、y座標が3である人は1番であることがわかります。先程のmp[y[i]].push_back(i)で i は0から始まる数値でしたから、それぞれの人の番号は実際より1少ない値が表示されていますね。

投稿2022/12/19 11:31

luuguas

総合スコア492

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

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

0

itr->second が指しているのは、
map<int,vector<int>> の右側、
vector<int>型を直接coutで出力させようとしてるからエラーになってると思われます。

vectorの出力例

投稿2022/12/18 17:20

mjk

総合スコア303

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問