トップページに戻る    次のC++のサンプルへ    前のC++のサンプルへ

2-6 ValArrayとVectorで多次元配列

C++のサンプル

ValArrayとVectorを組み合わせて多次元配列もどきを実装するサンプルです。


ソース

#include <vector>
#include <valarray>
#include <stdio.h>

void main()
{
    //intの2次元配列のサンプル
    std::valarray<int> XArr(111,2);
    std::vector<std::valarray<int> > TestArrVect1(3,XArr);

    std::vector<std::valarray<int> > TestArrVect2 = TestArrVect1; //代入演算で全要素をコピー可能

    for(int X=0;X<=(int)TestArrVect1.size()-1;X++){
        for(int Y=0;Y<=(int)TestArrVect1.at(X).size()-1;Y++){
            TestArrVect1.at(X)[Y] = 999;
        }
    }

    for(int X=0;X<=(int)TestArrVect1.size()-1;X++)
        for(int Y=0;Y<=(int)TestArrVect1.at(X).size()-1;Y++)
            printf("TestArrVect.at(%d)[%d] = %d\n",X,Y,TestArrVect1.at(X)[Y]);

    for(int X=0;X<=(int)TestArrVect2.size()-1;X++)
        for(int Y=0;Y<=(int)TestArrVect2.at(X).size()-1;Y++)
            printf("TestArrVect.at(%d)[%d] = %d\n",X,Y,TestArrVect2.at(X)[Y]);

    //GetUpperBound(0)
    printf("GetUpperBound(0) = %d\n",TestArrVect1.size());
    //GetUpperBound(1)
    printf("GetUpperBound(1) = %d\n",TestArrVect1.at(0).size());
}


実行結果

TestArrVect.at(0)[0] = 999
TestArrVect.at(0)[1] = 999
TestArrVect.at(1)[0] = 999
TestArrVect.at(1)[1] = 999
TestArrVect.at(2)[0] = 999
TestArrVect.at(2)[1] = 999
TestArrVect.at(0)[0] = 111
TestArrVect.at(0)[1] = 111
TestArrVect.at(1)[0] = 111
TestArrVect.at(1)[1] = 111
TestArrVect.at(2)[0] = 111
TestArrVect.at(2)[1] = 111
GetUpperBound(0) = 3
GetUpperBound(1) = 2


解説

2次元配列は、
ValArrayのVector
VectorのVector

3次元配列は、
VectorのVectorのVector
ValArrayのVectorのVector

などで実装でき、
ビルトイン配列での、全要素のコピー(memcpy関数やfor文での個別代入)や、
GetUpperBound(sizeof演算子)をシンプルに記述できます。