動的配列があるとしましょう:
int* p;
ifstream inFile("pop.txt");
int x;
while (inFile >> x)
{
// ????
}
配列のようp
に収まるようにサイズを変更するにはどうすればよいですか。x
私は言語を学ぼうとしているので、ベクトルや静的配列を使いたくありません。初期サイズがわからないので、ポインタを使用する必要があります。どんな試みでも大歓迎です。
動的配列があるとしましょう:
int* p;
ifstream inFile("pop.txt");
int x;
while (inFile >> x)
{
// ????
}
配列のようp
に収まるようにサイズを変更するにはどうすればよいですか。x
私は言語を学ぼうとしているので、ベクトルや静的配列を使いたくありません。初期サイズがわからないので、ポインタを使用する必要があります。どんな試みでも大歓迎です。
最も簡単な答えは、生の配列と生のメモリよりも高レベルのコンポーネントを読み取りに使用する必要があるということです。そうすれば、ライブラリがこれを処理します。一連の数値をアプリケーションに読み込む簡単な方法 (エラー処理なし) は、次の簡単なコードで実行できます。
std::vector<int> data;
std::copy(std::istream_iterator<int>(inFile), std::istream_iterator<int>(),
std::back_inserter(data));
int
このコードは、値を読み取るためにストリームからいくつかの入力イテレータを作成し、ベクターに適用するback_inserter
イテレータを使用します。push_back
ベクター自体は、必要に応じてメモリ バッファーの拡張を管理します。
これを手動で行う場合は、より大きなメモリ チャンクを割り当て、古いバッファから最初の N 個の要素をコピーし、古いバッファを解放して、より大きなバッファがいっぱいになるまで読み取りを続ける必要があります。同じ手順: 割り当て、コピー、古い割り当て解除、挿入の続行。
サイズを変更することはできません。できることは、新しいより大きな配列を割り当て、古い配列から新しい配列にすべてをコピーしてから、古い配列を解放することだけです。
たとえば(テストされていないコード)
int array_size = 10;
int* array = new int[array_size];
int array_in_use = 0;
int x;
while (in >> x)
{
if (array_in_use == array_size)
{
int* new_array = new int[2*array_size];
for (int i = 0; i < array_size; ++i)
new_array[i] = array[i];
delete[] array;
array = new_array;
array_size *= 2;
}
array[array_in_use++] = x;
}
それは退屈で、初心者がやっていることは良いことだとは思えません。ベクトルを適切に使用する方法を学べば、より有用なことを学ぶことができます。