1. ホーム
  2. c++

[解決済み] 動的なサイズの配列を作るには?動的配列の一般的な使用法(ポインタもそうかもしれません)?[クローズド]

2022-03-02 01:11:56

質問

私は、以下のようなプログラムを作ろうとしています。

  1. ユーザーの入力(仮に全部が int )
  2. 開始サイズを指定せずに配列に格納する(つまり、->ではない)。 array[5]; ); そして
  3. 配列に格納された情報を、どんな不吉な目的にも使用する。

必要であれば、独学でできるようになるため、助けを求めているのです。

  • サイズが設定されていない動的な配列を作るには?
  • 上記の配列の要素を使用/アクセス/到達するにはどうすればよいですか?

読書だけでは説明が足りなかった。

とてもくだらない質問なのは分かっていますし、そうです、私はくだらない人間なのです。

どのように解決するのですか?

について 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;