整数の動的配列を作成する方法


84

newキーワードを使用してC ++で整数の動的配列を作成するにはどうすればよいですか?


11
を使用しstd::vector<int>ます。そして
GManNickG 2010年

データが初期化されたら、どのようにデータを割り当ててアクセスしますか?

この投稿をご覧ください。ここでは、あらゆる種類のデータ型について詳しく説明しています
。programmingtunes.com/ dynamic


quora.com/What-is-the-meaning-of-%E2%80%9Cint- * p-new-10-%E2%80%9D#:〜:text = The%20statement%20defines%20and%20initializes、 of%20an%20array%20of%20integers。&text = This%20statement%20will%20dynamically%20allocate、integers%20from%20the%20heap ...
ナガッパ

回答:


127
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

delete割り当てるすべての配列を忘れないでくださいnew


27
-1はしませんが、忘れることさえできるのであればdelete、コードは間違っています。
GManNickG 2010年

2
8年後、そのコメントは初心者の@GManNickGを混乱させる可能性がありますが、削除するのはどうですか(Jason Iversonが実際に配列を削除する前に行われたと思われるため)。
gsamaras 2018年

2
@gsamaras:紛らわしいことに同意しますが、それでも正しいです。コードを手動で削除してはならず、忘れないように注意する必要があります。つまり、スマートポインタやその他のコンテナを使用しました。
GManNickG 2018年

@GManNickGあなたのコメントは独断的ではないかもしれないと思います。理想的でなくても、コードは正しいです。スマートポインタとコンテナは、ほとんどの場合(特にこのような初心者の質問では)より良いオプションですが、常に「常に」というわけではありません。
スペンサー

63

C ++ 11以降、以下とは異なり、オーバーヘッドがゼロの安全な代替手段がnew[]ありdelete[]ますstd::vector

std::unique_ptr<int[]> array(new int[size]);

C ++ 14の場合:

auto array = std::make_unique<int[]>(size);

上記の両方が同じヘッダーファイルに依存しています、 #include <memory>


それが私だけかどうかはわかりませんが、C ++ 11構文はひどいように見えます。C ++ 14はずっと良く見えます。それからまた、私はC ++ 11以前から追いついていない。これらすべての新しい表現を覚えるのは難しいです。
Keya Kersting

28

標準テンプレートライブラリの使用を検討することをお勧めします。シンプルで使いやすく、メモリの割り当てについて心配する必要はありません。

http://www.cplusplus.com/reference/stl/vector/vector/

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

18
わかりましたが、実際の質問に答えるのもいいです。
Ed S.

8
@Ed、質問の制限はかなり恣意的です。std::vector適切なコンストラクターを使用すると非常にうまく機能するため、代替手段として指摘する必要があります。時々人々はよく質問をしません、そしてこれはそれらのケースの1つとして数えられるかもしれません-それは非常に短く、好む理由を与えませんnew
マークランサム

3
@Ed:のnew[]代わりに使用する理由はありませんstd::vector
GManNickG 2010年

2
@baash:C ++では、理由はありません。何らかの理由で「標準ライブラリを削除する」ことにした場合、C ++でプログラミングすることはもうありません。私のコメントはC ++言語に関するものであり、C ++言語-we-use-on-my-deviceに対するものではありません。それでも、delete手動で何かをする必要はありません。また、std::vectorは動的配列であり、リンクリストでは何もしません。これは、メモリのチャンクの単なるラッパーです。
GManNickG 2010年

1
@Montdidier:いいえ。まだラッパーを使用newdeleteて実装しています。重要なのは、リソース管理して使用するのではなく、どちらか一方を実行するということです。
GManNickG 2010年

6
int* array = new int[size];

2
それは質問に答えるだけです。
Ed S.

@GManNickGベクトルがより便利になる可能性があるため、または他の理由で?ベクトルの代わりに配列を使用する必要のあるサードパーティの関数に遭遇することがよくあるためです。
Lèseはmajesté

5
@Lèsemajestéベクトルを使用しない理由はありません—std::vector::data()メンバー関数は、必要に応じて基になる生の配列を返します。
emlai 2015年

3
@zenith:通常は、ベクトルからポインターを取得するのoperator&ではなく使用しdata()ますが、配列を期待する関数との互換性に必要な隣接性の保証をベクトルが提供するのは事実です。
Ben Voigt 2015年

3

動的配列について質問があるとすぐに、可変サイズの配列を作成するだけでなく、実行時にそのサイズを変更したい場合があります。これはの例memcpyです。memcpy_sまたはstd::copyを使用することもできます。コンパイラによっては、<memory.h>または<string.h>必要になる場合があります。この関数を使用するときは、新しいメモリ領域を割り当て、元のメモリ領域の値をコピーしてから解放します。

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

の代わりに定数4を使用できますsizeof(int)


1

を使用して動的にメモリを割り当てますnew

int* array = new int[SIZE];

2
コロンが欠落しているか、SIZEを実際のサイズに置き換えていない可能性があります。
モンディディエ2010年

5
なぜセミコロンが必要なのですか?それは完全な声明ではありません。より多くの宣言があるかもしれません。これは、完全なプログラムに含まれている場合、OPが要求したことを実行します。
ベンジャミンリンドリー

0
#include <stdio.h>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{

    float arr[2095879];
    long k,i;
    char ch[100];
    k=0;

    do{
        cin>>ch;
        arr[k]=atof(ch);
        k++;
     }while(ch[0]=='0');

    cout<<"Array output"<<endl;
    for(i=0;i<k;i++){
        cout<<arr[i]<<endl;
    }

    return 0;
}

上記のコードは機能し、定義できる最大のfloatまたはint配列サイズはサイズ2095879であり、終了条件はゼロ以外の開始入力番号になります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.