3

boost :: multi_arrayを使用して、c ++でテンプレートクラスの次元に依存しないコードを記述しようとしています(ただし、他のコンテナー/データ構造がこれに優れている場合は、喜んで聞いていただけます)。

ディメンションを指定して、他のすべてのディメンションの全範囲を反復処理し、選択したディメンションに沿って1Dビューを返します。これはかなり簡単です、または少なくともそれはブーストドキュメントからのものであるように見えます。

コンパイル時に配列の次元がわかっている場合、実行方法がわからないのは、配列のすべての次元で選択した次元を繰り返すことです。

これを行う方法について何かアドバイスはありますか?

4

1 に答える 1

1

通常、boost :: multi_arrayを使用して実行できます。ここでは、3Dmulti_arrayの2Dビューを作成するためのサンプルコードをいくつか示します。

#include "boost/multi_array.hpp"
#include <cassert>
#include <iostream>

int main()
{
    typedef boost::multi_array<double, 3> array_type;
    typedef array_type::index index;

    array_type myArray3D(boost::extents[3][4][2]);

    // Assign values to the elements
    int values = 0;
    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 4; ++j)
            {
                    for (index k = 0; k != 2; ++k)
                    {
                            myArray3D[i][j][k] = values++;
                    }
            }
    }
    // Verify values
    int verify = 0;
    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 4; ++j)
            {
                    for (index k = 0; k != 2; ++k)
                    {
                            std::cout << "[" << i << "]";
                            std::cout << "[" << j << "]";
                            std::cout << "[" << k << "] = ";
                            std::cout << myArray3D[i][j][k] << std::endl;
                            assert(myArray3D[i][j][k] == verify++);
                    }
            }
    }

    typedef boost::multi_array_types::index_range range;
    array_type::index_gen indices;

    // Create a new view with 2 dimentions fixing the 2nd dimention to 1
    array_type::array_view<2>::type myView =
    myArray3D[indices[range()][1][range()]];
    std::size_t numDims = myView.size();
    std::cout << "numDims = " << numDims << std::endl;

    for (index i = 0; i != 3; ++i)
    {
            for (index j = 0; j != 2; ++j)
            {
                    std::cout << "[" << i << "]";
                    std::cout << "[" << j << "] = ";
                    std::cout << myView[i][j] << std::endl;
            }
    }

    return 0;
}
于 2011-08-22T17:20:58.317 に答える