【C++】ポインタで多次元可変長配列を定義する

2655 ワード

c++のvectorコンテナは不定長配列を定義することができ,vectorのネストによって多次元を実現できることはよく知られているが,vectorは空間と時間の消費が大きすぎ,コードが複雑になることは明らかである.
この文書では、通常の配列に似ていますが、一度に定義するのではなく、長さを複数回定義できる方法と、高次元に拡張する方法について説明します.
C++の配列変数自体はポインタであり、配列内の要素メモリアドレスが連続しているため、この配列の最初の要素のメモリアドレスが格納されている.中かっこはアドレスオフセットの演算です.例えばint a[100];aは配列の最初の要素アドレスであり、a[i]を参照すると、メモリアドレス(a+i*intタイプバイト数)の値が実際に参照されるため、1つの文a[i]=10はi[a]=10と書くこともでき、コンパイル実行は正しい.
次元配列を定義する場合:
int length;//配列の長さ
int* a;
a=new int[length];//配列空間の割り当て
a[1]=3;
a[0]=2;
a[2]=a[1]+4;
//一般的な配列のようにアクセスできる
2 D配列を定義する場合:
(実質的には1次元配列にネストされた1次元配列)
int n,m;
int** a;
a=new int*[n];
for(int i=0;i<=n;i++)
{
    a[i]=new int[m];
};
//            ,              
a[1][5]=10;

int**aって何ですか?aは整数型を指すタイプであり、すなわちa[]は記憶アドレスの配列であり、a[i]は私たちの2次元配列のi行目の1列目の要素アドレス、すなわちこの行の配列頭アドレスを記憶し、1次元・配列を指し、a[i][j]は私たちの2次元数群のi行目のj列目の要素である.同様に、より高い次元に広がるのは同じ理屈です.
使用後にメモリを解放することに注意!!!
//        
for(int i=0;i<=n;i++)
    delete []a[i];//                
delete []a;

解放されると、配列サイズを再定義することができ、同じ配列変数名で長さを複数回再定義することができます.
クラス化され、より使いやすい
 class myarray
    {
        public:
        int width,height;
        int** array;//    ,           
        bool created=false;
        void dispose()
        {//    
            for(int i=0;i<=width;i++)
            {
                delete []array[i];
            };
            delete []array;
        }
        void create(int Width,int Height)
        {//  
            if (created) dispose();//   ,       ;
            created=true;
            width=Width;
            height=Height;
            array=new int*[width];
            for(int i=0;i<=width;i++)
            {
                matrix[i]=new int[height];
            };
        }

    };
//        
myarray  a;
a.create(100,100);
a.array[1][3]=10;
a.create(10,40);//      
a.array[5][30]=20;

, , , a.create(5,5), 5*5 , , cout <