質問: **エラーメッセージ:** ``` これらのオペランドと一致する演算子 ">>" はありません -- オペランドの型: std::istream >> graphC/C++(349) ``` **ソースコード:** ``` #include using namespace std; int main() { int h, w; vector> P[9][10001]; cin >> h >> w; for(int i=1; i <= h; i++){ for(int j=1; j <= w; j++) cin >> P[i][j]; // この行の >> 部分にエラーが起きます。 } return 0; } ```
回答: 題意的に、求めるものは「配列の配列」2次元配列であった模様。 `std::vector v1;` とするとそれだけで `v1` は可変長配列です(この表記では要素数0) `std::vector > v2;` とすると `v2` は「可変長配列を要素とする可変長配列」です(要素数0の配列が0個あるだけなので、これだけでは実用できません) なので `std::vector > v3[9][10001];` は「「可変長配列を要素とする可変長配列」の「固定長配列の固定長配列」」ということになり4次元配列となってしまいます。 固定長二次元配列が欲しいなら回答は `int P[9][10001];` ということになります。 以下余談 明日のための第一歩: `std::vector vec(10001);` と [c](/questions/tagged/c "'c' のタグが付いた質問を表示") 互換配列 `T arr[10001];` では記憶装置上のメモリ配置が異なることは意識しておきましょう。これがイメージできるようになったら 明日のための第二歩: `std::vector > v2;` のメモリ配置がどうなっているのかイメージできるようになりましょう。そうしたら `v2` の要素数を増やす際にどんなコードが必要か理解できると思います。 更に余談 Win32 (x86) においてデフォルトスタックサイズは 1MiB `int P[9][10001];` はこれだけで 351.6KiB なので自動変数として `P` を2つ作るのがせいぜいで3つ作ることはできません。 `vector` ならメモリの許す限り何個でも作れますので、将来をにらむなら `vector` を正しく使い方法を今のうちに学んでおくことも悪くないです。でも YAGNI 則に基づき普通の自動変数としておくのもよい選択肢です。 将来 [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") でメシ喰えるようになるには `#include ` とか、大域 `using namespace std;` のような悪癖をマネしないようにしませう。この書き方は競技プログラミング業界固有の非標準なものです。オイラの部下がこんなこと書いてたらソースコードレビューの場で突っ返します。