vector
ここに 3 つの解決策があります。1 つ目はサンプル コードに最も近いもので、2 つ目は境界内の配列要素を正しく取得できるようにするための改善であり、3 つ目はsを使用したほうがよい理由です。
解決策 1:
配列には、ループ反復子で区別できる名前を付けたいようです。ジョーが言ったように、配列の配列を持つことができるので、内側の配列は配列[0]、配列[1]、...、配列[n - 1]と名付けられます。これは、double へのポインターへのポインターを使用して実現されます。各内部ポインターは、double の配列を動的に割り当てるために使用されます。動的に割り当てられたメモリを削除することを忘れないでください。
#include <iostream>
int main()
{
unsigned int n;
std::cout << "Enter number of arrays: ";
std::cin >> n;
double** array = new double*[n];
for (int i = 0; i < n; ++i)
{
unsigned int size;
std::cout << "Enter size of array " << i << ": ";
std::cin >> size;
array[i] = new double[size];
for (int j = 0; j < size; ++j)
{
int element;
std::cout << "Enter element " << j << " of array " << i << ": ";
std::cin >> element;
array[i][j] = element;
}
}
for (int i = 0; i < n; ++i)
{
delete [] array[i];
}
delete[] array;
return 0;
}
解決策 2:
ただし、上記のコードでは、各内部配列の要素にアクセスするのに問題があります。これで作成する各内部配列のサイズを覚えていない限り、範囲外のものにアクセスする可能性があります。したがって、このコードを更新すると、さらに別の配列を追加することになります。それを と呼びましょうsizeOfInnerArrays
。ここで、その要素のそれぞれがi
内部配列のサイズを追跡しarray[i]
ます。アップデートは次のとおりです。
#include <iostream>
int main()
{
unsigned int n;
std::cout << "Enter number of arrays: ";
std::cin >> n;
double** array = new double*[n];
unsigned int* sizeOfInnerArrays = new unsigned int[n];
for (int i = 0; i < n; ++i)
{
std::cout << "Enter size of array " << i << ": ";
std::cin >> sizeOfInnerArrays[i];
array[i] = new double[sizeOfInnerArrays[i]];
for (int j = 0; j < sizeOfInnerArrays[i]; ++j)
{
int element;
std::cout << "Enter element " << j << " of array " << i << ": ";
std::cin >> element;
array[i][j] = element;
}
}
//prints out each array as curly-brace enclosed sets of doubles
for (int i = 0; i < n; ++i)
{
std::cout << "{";
for (int j = 0; j < sizeOfInnerArrays[i] - 1; ++j)
{
std::cout << array[i][j] << ", ";
}
std::cout << array[i][sizeOfInnerArrays[i] - 1] << "}" << std::endl;
}
// free dynamically allocated memory
for (int i = 0; i < n; ++i)
{
delete [] array[i];
}
delete[] array;
delete[] sizeOfInnerArrays;
return 0;
}
解決策 3:
ただし、これは複雑すぎるため、vector
Joe が提案したように、データ メンバーがそのサイズを追跡する のようなコンテナーを使用することをお勧めします。
#include <iostream>
#include <vector>
int main()
{
unsigned int n;
std::cout << "Enter number of vectors: ";
std::cin >> n;
std::vector<std::vector<double> > myVec;
// ^ space between closing angle brackets not needed
// if using C++11 conforming compiler
for (int i = 0; i < n; ++i)
{
unsigned int size;
std::cout << "Enter size of vector " << i << ": ";
std::cin >> size;
std::vector<double> temp;
temp.reserve(size);
for (int j = 0; j < size; ++j)
{
double value;
std::cout << "Enter next value of vector " << i << ": ";
std::cin >> value;
temp.push_back(value);
}
myVec.push_back(temp);
}
for (int i = 0; i < myVec.size(); ++i)
{
std::cout << "{";
for (int j = 0; j < myVec.at(i).size() - 1; ++j)
{
std::cout << myVec.at(i).at(j) << ", ";
}
std::cout << myVec.at(i).back() << "}" << std::endl;
}
return 0;
}