事前にサイズがわからないC++(gcc)でテーブルを格納したいのですが、どのような構造を使用するかがリアルタイムで決定されますか?
5 に答える
テーブルのレコードに使用する構造のベクトルを作成します。
vector<MyRecord> v;
以下を使用してレコード(タイプMyRecordのオブジェクト)を追加します。
v.push_back(record);
ほとんどの目的のためのstd::vector
、またはstd::deque
あなたが探しているものであるアレイを意味する場合。
std::vector<ClassOrTypeYouNeedToStore> v;
v.push_back(1):
v.push_back(2):
v.push_back(3):
std::cout << "Length of vector " << v.size() << std::endl;
// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
std::cout << "Next element is " << *it << std::endl;
}
// C++11+
for (auto it = v.begin(); it != v.end(); it++) {
std::cout << "Next element is " << *it << std::endl;
}
それは、何を保存する必要があるかによって異なります。列が固定されていて異なる型であり、行を動的に挿入および削除できるようにする場合は、 が必要になる場合がありますstd::vector<std::tuple<T,U,V>>
(または の代わりに、tuple
何らかの構造体を使用できます)。
列が固定されているがすべて同じタイプの場合は、試してstd::vector<std::array<T,N>>
みてください。
行と列の数が固定されていて、同じタイプの場合は、 を試してくださいstd::array<std::array<T,N>,M>
。
行と列の数が固定されていても、各列のタイプが異なる場合は、std::array<std::tuple<T,U,V>,N>
うまくいくはずです。
列の数も変化させたい場合は、内部の型をstd::vector
何らかの種類にする必要があります。
通常、その場合は を使用しますstd::vector
。
size_t rsz = 4;
size_t csz = 4;
std::vector<double> table(rsz*csz, 0.0);
for (size_t i = 0; i < rsz; i++) {
for (size_t j = 0; j < csz; j++) {
table[i*csz+j] = i * 10 + j;
}
}
私は1Dベクトルを好む傾向があり、自分でオフセット演算を行うだけです。ヘルパー関数が過度に専門化されるのを防ぎます。
提案されているように、「サイズ」が使用できる「行数」を意味する場合は、、、またはを使用できますvector<vector<CellType>>
(私のお気に入りのソリューション)。配列には一定の長さ (パフォーマンス、メモリ フットプリント、メモリ アラインメント) という利点があり、このソリューションでは、リレーショナル DB とほぼ同じ柔軟性が得られます。vector<RowType>
vector<array<RowSize, CellType>>