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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1005閲覧

[C++] 多次元配列

Kaguya_4869

総合スコア116

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/12/19 03:29

前置き
こんにちは。
最近競技プログラミングを
こちら(Atcoder)のページで勉強しています。
その中の2次元配列の問題で質問があります。

#質問したいこと
2次元配列の問題の一番下のページに、回答サンプルがあるのですが、このプログラムの

C++

1for (int i = 0; i < M; i++) { 2 // 1〜N → 0〜N-1 に変換 3 A.at(i)--; B.at(i)--; 4 table.at(A.at(i)).at(B.at(i)) = 'o'; // AはBに勝った 5 table.at(B.at(i)).at(A.at(i)) = 'x'; // BはAに負けた 6}

の部分が分からないです。特に、

C++

1 // 1〜N → 0〜N-1 に変換 2 A.at(i)--; B.at(i)--; 3

が分からないです。
このコードを入れずに実行すると、

terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 3)

というエラーが出てきます。
これは、配列の数よりも大きい値にアクセスしようとしてしまっているため、
出てきてしまうエラーだと思うのですが、なぜこのエラーが出てしまうのかも理解ができていません。

#コード
解答全体のコードです。

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int N, M; 6 cin >> N >> M; 7 vector<int> A(M), B(M); 8 for (int i = 0; i < M; i++) { 9 cin >> A.at(i) >> B.at(i); 10 } 11 12 // N×Nのchar型の2次元配列のすべての要素を'-'で初期化 13 vector<vector<char>> table(N, vector<char>(N, '-')); 14 15 16 /*この部分が質問箇所です。*/ 17 for (int i = 0; i < M; i++) { 18 // 1〜N → 0〜N-1 に変換 19 A.at(i)--; B.at(i)--; 20 table.at(A.at(i)).at(B.at(i)) = 'o'; // AはBに勝った 21 table.at(B.at(i)).at(A.at(i)) = 'x'; // BはAに負けた 22 } 23 24 for (int i = 0; i < N; i++) { 25 for (int j = 0; j < N; j++) { 26 cout << table.at(i).at(j); 27 if (j == N - 1) { 28 cout << endl; // 行末なら改行 29 } 30 else { 31 cout << " "; // 行末でないなら空白を出力 32 } 33 } 34 } 35} 36

初心者なので、詳しく教えていただけると幸いです。
よろしくお願い致します。

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

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

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

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

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

episteme

2021/12/19 03:43

多次元配列であることは関係ありません。一次元でも同じ問題は起こります。
guest

回答1

0

ベストアンサー

vevtor<char> v; の要素数(v.size())がNのとき、
v.at(0~N-1) じゃないと範囲外となるから。

※ その理由がわからないのかしら。
配列の添え字は0から始まる。0から始まって要素数Nなら最後の添え字はN-1となる。

投稿2021/12/19 03:39

編集2021/12/19 03:41
episteme

総合スコア16614

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

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

Kaguya_4869

2021/12/19 04:22

episteme様 迅速な回答ありがとうございます。 配列の添字が0から始まるため、1引かなければいけないということが理解できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問