65332


[AtCoderの問題](https://atcoder.jp/contests/abc157/tasks/abc157_b)にて以下のコードを書きました。入力を与えて実行するとvector
subscript out of
rangeというエラーメッセージが表示されプログラムが実行されません。定義している配列の範囲がおかしいために生じていると考えたのですが、[回答例(pdf2ページ目)](https://img.atcoder.jp/abc157/editorial.pdf)も同じようにしており、なぜエラーになるのかが分かりません。原因、改善点を教えて頂けると幸いです。

[code]

    #include<iostream>
    #include<string>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    int main() {
        vector<vector<int>>a(3, vector<int>(3));
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                cin >> a[i][j];
            }
        }
        int n;
        cin >> n;
        vector<int>b(n);
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
    
        vector<vector<bool>>flag(3, vector<bool>(3, false));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                    if (a[i][j] == b[k]) flag[i][j] = true;
                }
            }
        }
    
        for (int i = 0; i < 3; i++) {
            if (flag[i][0] && flag[i][1] && flag[i][2]) cout << "Yes" << endl;
            else if (flag[0][i] && flag[1][i] && flag[2][i])cout << "Yes" << endl;
            else if (flag[0][0] && flag[1][1] && flag[2][2])cout << "Yes" << endl;
            else if (flag[0][2] && flag[1][1] && flag[2][0])cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
    
[/code]


CC BY-SA 4.0
2020-04-03T07:35:52.740
65325
2020-04-03T09:13:34.467
2020-04-03T07:42:14.260
36506
36506
question
c++
C++にてvector subscript out of rangeというエラーの解決方法が分からない


[`std::vector::operator[]`](https://docs.microsoft.com/ja-jp/cpp/standard-
library/vector-class?view=vs-2019#op_at)のドキュメントに

> _ITERATOR_DEBUG_LEVEL を 1 または 2
> に定義してコンパイルすると、ベクターの境界外の要素にアクセスしようとした場合に実行時エラーが発生します。

と説明されています。また[`_ITERATOR_DEBUG_LEVEL`](https://docs.microsoft.com/ja-
jp/cpp/standard-library/iterator-debug-
level?view=vs-2019)の説明にはデバッグビルドの際、`_ITERATOR_DEBUG_LEVEL`の既定値は`2`であると書かれています。  
そのため、デバッグビルドを行うと`std::vector`はアクセス毎に境界チェックを行います。

また、`operator[]`とは別に常に境界チェックを行う`at()`関数も用意されています。

C言語の配列にはもちろん境界チェック機能はありません。この点が解答例との違いとなります。


CC BY-SA 4.0
2020-04-03T09:13:34.467
65332
2020-04-03T09:13:34.467
4236
65325
answer