1

次のコードを使用して動的 2D 配列を作成しています。

uint32_t** arrays = new uint32_t*[10]; 
uint32_t number = take input from console ;
arrays[0] = new uint32_t[number];
number = take input from console ;
arrays[1] = new uint32_t[number];
delete arrays[0] ;
number = take input from console ;
arrays[0] = new uint32_t[number] ;

入力値を知らなくても2次元のサイズを知る方法を教えてもらえますか? 配列[0]、配列[1]などで配列サイズを見つける方法を意味しますか?

4

3 に答える 3

3

newサイズ値を格納せずに、によって割り当てられたメモリ ブロックのサイズを決定する方法はありません。

編集:また、単に使用しないのはなぜvector< vector< uint32_t > > arrays;ですか?

于 2012-12-10T14:04:44.073 に答える
1

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 ;-)
}
于 2012-12-10T15:41:42.887 に答える
0

それを行う方法はありません。メモリ効率のために、割り当てられたメモリ ブロックのサイズがどこにでも格納されるとは限りません。2 次元には単純な配列の代わりにベクトルを使用することを検討してください。

于 2012-12-10T14:06:08.083 に答える