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

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

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

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

Q&A

解決済

1回答

674閲覧

AtcoderのB問題が分かりません。

oioimeister

総合スコア15

C++

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

0グッド

0クリップ

投稿2021/12/23 16:55

前提・実現したいこと

AtcoderのB問題を解いています。
問題文はこちらです。
https://atcoder.jp/contests/abc226/tasks/abc226_b

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

この問題の vector<int> v(L); for (auto& x : v) cin >> x; st.insert(v); の部分が具体的にどういう処理を行っているのかが分かりません。教えていただきたいです。

該当のソースコード

#include <iostream> #include <set> #include <vector> using namespace std; int main() { int N; cin >> N; set<vector<int>> st; for(int i = 0; i < N; i++) { int L; cin >> L; vector<int> v(L); for (auto& x : v) cin >> x; st.insert(v); } cout << st.size() << "\n"; }

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

vector<int> v(L)の要素xに入力から受け取った値を直接入れています。

int x; for(int i=0;i<N;i++){ cin >> x; v[i]=x; }

をxに値を入れてv[i]に代入するのではなく、v[i]の値が入っている場所に直接入力値を受け取っています。

st.insert(v)でstに配列を入れています。
最終的に重複した配列を一つとして、何通りの配列があるかのカウントに使います。

投稿2021/12/23 17:24

kyokio

総合スコア560

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

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

oioimeister

2021/12/23 17:36

何度も質問して申し訳ないのですが、v[i]というのはint型の配列ですよね? 例えばxの入力が 1 2 3 とあると,v[0] = 1 ,v[1] =2 ,v[3] =3となるということでしょうか? それでしたらst.insertではst[0] = 1,st[1] = 2, st[2] = 3という風になるのでしょうか?
kyokio

2021/12/23 17:44

stはsetなので辞書型だと思ってください。 stには配列丸々が要素として入ります。
episteme

2021/12/23 18:04

setが辞書というのはかなり乱暴かと。(辞書ならmapだし) 「重複を許さない集合」あたりではないかしら
oioimeister

2021/12/23 23:37

つまりst[0]=123 となるということですか?
episteme

2021/12/23 23:48

いえ、stの要素は vector<int> です。
oioimeister

2021/12/24 00:20

st=123ということですか?
oioimeister

2021/12/24 03:56

vector<int>ってint型の動的配列ってことですよね?配列丸々が要素として入るというのはどういうことなのですか?
oioimeister

2021/12/24 04:01

xの入力が 1 2 3 とあると,v[0] = 1 ,v[1] =2 ,v[3] =3,となりst.insert(v)でvの配列の要素が丸々入るのでstに後ろから123が入るのではないのでしょうか?
fana

2021/12/24 04:04

set<int> なら,このsetの要素はintだ. set<X>なら,このsetの要素はXだな. じゃあ, set< vector<int> > なら,このsetの要素は vector<int> 型のオブジェクトだろうよ.どう考えても.
oioimeister

2021/12/24 04:26

vector int型というのは分かるのですが、insertでデータを追加するときに、配列を丸々入れるということの意味が具体的にどういう処理を表しているのか教えていただけませんか?
fana

2021/12/24 04:29

スーパーかどこかに行ったときに「買い物かごに,もやしを入れて」って言われたとき, 「せっかくだから俺はこのもやしの袋を破って中身のもやし群だけを買い物かごの中にぶちまけるぜ!」とはならないっしょ. 袋のままで かごに入れるっしょ. setにvectorをそのまま入れることを考えようよ.中身の要素だけをぶちまけるんじゃなくて.
oioimeister

2021/12/24 04:33

setの各要素がvector intになっているってことですか?
fana

2021/12/24 04:38

そう(だと最初から言われているじゃない). ※それはそれとして,もうちょっと表記に気を配ってはどうか. 3つの数値からなる列を示すなら "123" じゃなくて例えば "{1,2,3}" とか書くとか, "vector int" じゃなくて "vector<int>" と書くとか.
oioimeister

2021/12/24 05:23

なるほど理解しました。手間取らせてしまい申し訳ありませんでした。123とかいたのは、1,2,3が結合して百二十三になると勘違いしてたからです。わざわざありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問