std::vector<std::valarray<uint32_t> >
代替になる場合もあります。コンソール プログラムがなんらかの計算を行うと仮定すると、どちらかというと未知のstd::valarray
ものは良い仲間になります。
ユーザーが指定したサイズの値が例外につながる可能性があるというリスクに注意してください。そのstd::bad_alloc
ため、少なくとも割り当てを try/catch ブロックに入れることができます。
もう 1 つの解決策は、ユーザーが指定したすべてのサイズ値をコンテナーに収集してから、データ用に別の単一のコンテナーをインスタンス化することです。
//Disclaimer: below code has never been tested and is rather about how to do such stuff in general,
//regardless of the few bytes gained for sacrificing CPU cycles.
#include <vector>
#include <valarray>
#include <numeric>
#include <cassert>
#include <exception>
void app(void)
{
std::vector<size_t> sizes;
std::valarray<uint32_t> data;
try
{
//collect N user defined sub-vector size values in 'sizes'
//.
//.
//.
size_t totalNumberOfValues = std::accumulate(sizes.begin(),sizes.end(),0u);
data.resize(totalNumberOfValues);
}
catch(std::bad_alloc& e)
{
//handle error
}
//accessing the minor/sub-vectors using the size values requires accumulation of adjacent size values of preceding sub-vectors.
//of course, these offsets could also be pre-computed.
size_t subVectorIndex /*...*/; //needs to be checked!
assert(subVectorIndex < sizes.size());
size_t subVectorSize = sizes[subVectorIndex];
size_t subVectorOffset = std::accumulate(sizes.begin(),sizes.begin()+subVectorIndex,0u);
//do NOT reallocate 'data' while twiddling around with pointers!
uint32_t* subVectorData = &data[subVectorOffset];
//well, using neat stuff like std::slice, std::gslice etc. is up to you now ;-)
}