int x[100][100]
これらの要素のうちのいくつかだけが必要ですが、使用されないメモリがかなりあります(まだ存在し、はを初期化する必要があります)。
これに対する解決策は、ポインタと動的割り当てです。最初の行を読んだら、正しい量の「サブアレイ」を割り当てることは簡単です。この問題は、サブアレイのすべての要素が可変数であるように見えるため、サブアレイをどのように処理するかによって発生します。サブアレイごとに一定量の要素を割り当てることができます。さらに必要ないことを願っています(初期化が必要な無駄なメモリの問題を取り戻す)。入力上で2つのパスを実行すると、問題のいくつかを緩和することができます.1つは行の要素の最大数を取得し、もう1つは実際にデータを読み取ることです。
2番目のオプションは、各行に十分な要素を読み取り、動的に割り当てることです。これには、入力が解析され、行が終了したことを知る必要があります。また、新しい番号を追加するときに再割り当てを使用する必要があります。また、各サブアレイの要素数を追跡して、外出するリスクを回避する必要があります。
各行の要素数を追跡するには、秒の配列をカウントに使用するか、あるいは、構造体の配列を代わりに使用することもできます。各構造体には、要素の数と各行のサブ配列が含まれています。
(私はこれはC++に気づいたということになりました - タグ付けされた質問ではなくC)よりよい解決策あなたはstd::vector
を使用する必要があります。むしろベクトルのベクトル(int
)です。
最初の行を読み、その番号を解析すると、必要なサブベクトルの数が分かり、事前に割り当てることができます。
そして、それはstd::getline
とstd::istringstream
とstd::istream_iterator
とC++で非常にに簡単である、データの残りの部分を読んだだけの問題です。
おそらく、このような何か:もちろん
std::string line;
// Get the first line, the amount of extra lines to read
std::getline(input_file, line);
// Create the vector (of vectors)
std::vector<std::vector<int>> data;
size_t number_of_sub_vectors = std::stoi(line);
// Preallocate memory for the sub-vectors
data.reserve(number_of_sub_vectors);
// Now read the data for each line
for (size_t i = 0; i < number_of_sub_vectors; ++i)
{
// Get the data for the current line
std::getline(input_file, line);
// And put into an input string stream for parsing
std::istringstream iss(line);
// Create the sub-vector in-place, and populate it with the data from the file
data.emplace_back(std::istream_iterator<int>(iss),
std::istream_iterator<int>());
}
上記の例では、本当に必要とされる、エラー処理のいずれかの種類を持っていません。
各行を別々のベクトルに置き、ベクトル要素を計算します。 – Lukasz