[解決済み] 動的なサイズの配列を作るには?動的配列の一般的な使用法(ポインタもそうかもしれません)?[クローズド]
質問
私は、以下のようなプログラムを作ろうとしています。
-
ユーザーの入力(仮に全部が
int
) -
開始サイズを指定せずに配列に格納する(つまり、->ではない)。
array[5];
); そして - 配列に格納された情報を、どんな不吉な目的にも使用する。
必要であれば、独学でできるようになるため、助けを求めているのです。
- サイズが設定されていない動的な配列を作るには?
- 上記の配列の要素を使用/アクセス/到達するにはどうすればよいですか?
読書だけでは説明が足りなかった。
とてもくだらない質問なのは分かっていますし、そうです、私はくだらない人間なのです。
どのように解決するのですか?
について C++ :
コンテナだけが必要な場合は
std:vector
. 必要なメモリ確保はすべてやってくれます。しかし、もしあなたが独自の動的コンテナを開発したいのなら(どんな理由があるにせよ)、自分でメモリの割り当てを行う必要があります。つまり、配列が大きくなったら新しいメモリチャンクを確保し、現在の配列の値を新しいメモリ位置にコピーし、新しく確保したメモリに新しい値を追加しなければなりません。通常、このようなロジックは別のクラスでラップします。
GrowingArray
(標準提供の
vector
クラス)
EDIT
私の回答をさらに詳しく説明すると(学習目的で使用していることを前提に)。
<ブロッククオート開始サイズを指定せずに配列に格納する(つまり、-> array[5];ではない)。
ここでは、次のようなものを使いたい。
int * myDynamicArray;
ユーザーが何らかの値を入力すると、それらの値が格納されるメモリチャンクを割り当てます。
myDynamicArray = new int[5];
を、最初の入力の大きさで指定します。また、配列のサイズを変数に保存しておくこともお勧めします。
int arraySize = 5;
後で、新しい値を
myDynamicArray
まず最初に、成長した配列(現在の配列要素+新しい配列要素)用に新しいメモリチャンクを割り当てる必要があります。たとえば、新しい値が 10 個入ってくるとしましょう。そうすると、こうなります。
int* grownArray = new int[arraySize+10];
これは、成長した配列のための新しいメモリチャンクを確保するものです。次に、古いメモリチャンクから新しいメモリチャンクに項目をコピーし、ユーザが追加した値を追加します(あなたは学習目的でこれを使用していると思われるので、要素をコピーするための簡単なサイクルを提供しました。次のようにします。
std:copy
またはcのように
memcopy
も同様)。
int i = 0;
for (; i < arraySize; ++i)
{
grownArray[i] = myDynamicArray [i];
}
// enlarge newly allocated array:
arraySize+= 10;
for (; i < arraySize; ++i)
{
grownArray[i] = newValues from somewhere
}
// release old memory
delete[] myDynamicArray;
// reassign myDynamicArray pointer to point to expanded array
myDynamicArray = gronwArray;
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] Javascriptの配列に、指定された値に等しい属性を持つオブジェクトが含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない