14

私はプログラムを作ろうとしています

  1. ユーザー入力を受け取ります(すべてがそうであるとしましょうint
  2. 開始サイズなしで配列に格納します(つまり、->ではありませんarray[5];)。その後
  3. 配列に格納されている情報は、不吉な目的に使用してください。

必要に応じて自分でこれを行う方法を学ぶことができるように、私は助けを求めています。

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

読書は私にとって十分に説明しませんでした。

私はそれが非常に初心者の質問であることを知っています、そしてはい、私は初心者ですが、それを変えるには助けが必要です。

4

5 に答える 5

18

C ++の場合:

コンテナが必要な場合は、を使用してstd:vectorください。それはあなたに必要なすべてのメモリ割り当てを処理します。ただし、独自の動的コンテナを開発する場合(理由が何であれ)、メモリの割り当てを自分で行う必要があります。つまり、配列が大きくなったときに、新しいメモリチャンクを割り当て、現在の配列値を新しいメモリ位置にコピーし、新しく割り当てられたメモリに新しい値を追加する必要があります。通常、この種のロジックを別のクラス内にラップしますGrowingArray(標準で提供されるvectorクラスなど) 。

編集

私の答えをさらに詳しく説明するには(これを学習目的で使用している場合):

開始サイズのない配列に格納します(つまり、-> array [5];ではありません)。

ここでは、次int * myDynamicArray; のようなものを使用します。ユーザーがいくつかの値を入力するとき、それらの値が格納される場所にメモリチャンクを割り当てます:myDynamicArray = new int[5];最初の入力のサイズで。配列のサイズをいくつかの変数に保存することもお勧めします。int arraySize = 5; 後で新しい値をmyDynamicArray最初に追加する場合は、拡張された配列(現在の配列要素+新しい配列要素)に新しいメモリチャンクを割り当てる必要があります。10個の新しい値が来るとしましょう。次に、次のようにします。int* grownArray = new int[arraySize+10];これにより、拡張されたアレイに新しいメモリチャンクが割り当てられます。次に、古いメモリチャンクから新しいメモリチャンクにアイテムをコピーし、ユーザーが追加した値を追加します(これは学習目的で使用していると思いますので、要素をコピーするための簡単なサイクルを提供しましたstd:copymemcopy同じように):

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;
于 2012-11-17T14:46:24.617 に答える
16

これはおそらく最も賢い(いくつかの場合は不可解な過度のSTL使用法)方法です...

std::vector<int> vec;

// read integers 1 at a time from the user,
// will stop when non-integer input is entered
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(), 
          std::back_inserter(vec));

// print out the vector
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
于 2012-11-17T14:49:52.727 に答える
10

これが私がC++で書いた基本的なコードです。

#include <iostream>

int main(int argc, char *argv[])
{
    int* my_dynamic_array;

    int size;
    std::cin >> size;

    my_dynamic_array = new int[size];

    for (int k=0; k<size; k++)
        my_dynamic_array[k] = k;

    for (int k=0; k<size; k++)
        std::cout << my_dynamic_array[k] << std::endl;

    delete[] my_dynamic_array;

    return 0;
}

さて、これがこのコードで起こっていることです。std :: cinを使用して配列のサイズを入力するように求められ、次にnewキーワードを使用して配列にメモリを動的に割り当てます。ここには、最初は少し奇妙に見える詳細がいくつかあります。これが、多くの新しいC++開発者との混乱を引き起こしているようです。

したがって、最初に、配列宣言の代わりにポインタを使用して動的配列を宣言しました。たとえば、のint *my_dynamic_array代わりに使用しましたint my_dynamic_array[]。最初はこれは些細なことのように思えますが、CおよびC++で何が起こっているかについて理解する必要があることがあります。

配列を静的に宣言すると、そのメモリを使用できるように取っておくことをプログラムに指示することになります。それは実際にそこにあります。使い始めるのはあなた次第です。配列を動的に作成するときは、ポインターから始めます。ポインタは、メモリへの単なる参照です。そのメモリはまだ割り当てられていません。たとえば、で何かにアクセスしようとするとmy_dynamic_array[3]、厄介なエラーが発生します。これは、その場所のメモリには実際には何もないためです(少なくとも、使用するプログラムに与えられたものは何もありません)。

delete[]の代わりにの使用にも注意してくださいdelete。これが、アレイの使用が終了したときにメモリを解放する方法です。

これをCで行っている場合、これはほとんど同じように考えることができますが、代わりにnewdelete[]mallocありますfree

動的配列とポインターの微妙な違いを知るのは難しいです。何が起こっているのかを完全に理解するまでに少し時間がかかりました。頑張って頑張ってください。

于 2012-11-17T14:47:24.030 に答える
1

Cでは、この方法を使用できます。

int i=0;
int *p;
char c;
int size; 
printf("Enter size :");
scanf("%d",&size); 
int *p=malloc(sizeof(int)*size);
do
{
 printf("Enter Number : ");
 scanf("%d",&p[i]);
 i++;
 printf("Press 'q' or 'Q' to quit or any other key to continue : ");
 scanf("%c",&c);
}
while(c!='q' && c!='Q' && i<=size);
p=realloc(p,i*sizeof(int));

このようにして、必要な整数の数が割り当てられたメモリより少ない場合に、割り当てられた残りのメモリを解放できます。

于 2012-11-17T14:59:07.513 に答える
1

私はあなたに提案をします。Cで開発する場合は、配列の代わりにリンクリストを使用できます。

ここで例の後に:

typedef struct linked_list {
    int x,
    struct linked_list *next
} linked_list;

struct linked_list *head = NULL;

void add_element(int x)
{
    struct linked_list *elem;
    elem = malloc(sizeof(struct linked_list));
    elem->x =x;
    elem->next = head;
    head = elem;
}

int main()
{
   int x;
   struct linked_list *p;
   do
   {
       printf("Enter Number : ");
       scanf("%d",&x);
       add_element(x)
       printf("Press 'q' or 'Q' to quit or any other key to continue : ");
       scanf("%c",&c);
   }while(c!='q' && c!='Q');

   for (p=head;p!=NULL;p=p->next)
   {
        printf(%d\r\n",p->x);
   }

}
于 2012-11-17T15:35:49.250 に答える