c++で配列をすべての要素0として初期化したい場合
c++
1a[10] = {};
とかけますが、要素数が変数で与えられている場合はこれは使えないと返されます。
つまり下のようなコードではエラーがでるということです。
c++
1n = 10; 2a[n] = {}
このような場合は、forループを使ってすべての要素に0を代入していくしかないでしょうか。もっとシンプルな書き方はありますか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
C++であれば、生配列よりSTLを積極的に使うべきです。
コンパイル時にサイズが確定しないのであればstd::vectorが有用でしょう。
C++
1#include <iostream> 2#include <vector> 3 4int main(void) { 5 int n = 10; 6 std::vector<int> vec(n, 0); 7 8 for(auto e: vec) { 9 std::cout << e << ", "; 10 } 11 std::cout << std::endl; 12}
実行結果 Wandbox
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
投稿2020/01/29 03:19
編集2020/01/29 06:09総合スコア35676
0
質問の下のやつは、そもそもコンパイル自体が通りません。(Cですら)
型名はちゃんと書きましょう。(仮にイメージとしてであればそれを書くべきです。例:「あくまでイメージです」)
C++
1n = 10; // <= 型名がない. 2a[n] = {} // <= セミコロン(最後のやつ)がない. また、これも型名がない.
となっています。
これらは質問者さんの(質問時の)ミスとかイメージとしてとかのようなものだと仮定すると、
「constを要素数(としての変数)につければ可能」です。
つまり、
C++
1const int n = 10; // <= constをつける 2a[n] = {};
とすればいけるはずです。
C言語では確か、質問のようなコード(もちろん型名とかが抜けているとかのアレは修正したものとして)はいけるはずですが、C++では「配列宣言時の要素数は定数でなければいけない」だったはずです。
なので constをつけて定数扱いにすればいけるはずです。
(一応paiza IOで試してみました。)
[追記1]
一応、標準入力等で取得した後にでも可能ですよ。
実際、
C++
1#include<iostream> 2 3void func1( int size ){ 4 const int max = size; // <= constをつけている 5 int arr[max] = {}; 6 // 何らかの処理 7return; 8} 9 10int main( void ){ 11 int n; 12 std::cout << "n = " << std::flush; 13 cin >> n; 14 func1( n ); 15return 0; 16}
みたいな、呼び出した関数内で配列を定義したりするとかみたいな感じでやったりしますし。
ただ、他の方々もおっしゃっているように std::vectorを使うか、memsetを使うほうが楽かもしれません。
投稿2020/01/29 03:05
編集2020/01/29 06:41総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 05:41
2020/01/29 05:45 編集
2020/01/29 06:05 編集
2020/01/29 06:09
2020/01/29 06:09
2020/01/29 06:14
2020/01/29 06:17