我可以从boost :: multi_array <t,2 =“”>得到T **(c样式二维数组)?</t,>

时间:2012-07-20 00:33:37

标签: c++ arrays boost multidimensional-array

因为我想使用boost :: multi_array&lt;&gt;,同时,遗留库需要c style 2d数组。

2 个答案:

答案 0 :(得分:2)

T ** 不是 C风格的数组。内置的C风格数组是通过覆盖在普通1D阵列上的索引重新计算技术实现的。

T **将是一个手动实现的“多级”2D阵列。这种2D数组使用两级实现,第一级数组是指向包含实际数据的二级数组的指针数组。这是一种完全不同的方法,与内置阵列不兼容。

boost::multi_array<T, 2>使用的内存布局与内置C风格数组相同,即它是一个1D数组,通过索引重新计算“假装”为2D。你不能从中“提取”一个T **样式的数组,因为boost::multi_array中不存在两层存储结构。

这实际上提出了遗留库需要什么类型的数组的问题:T ** - 样式数组或C样式数组,因为它们不相同。

答案 1 :(得分:1)

如果boost多数组的布局方式与原始c ++数组相同,那么您是否可以以标准方式访问它?

来自boost multi_array reference

  

c_storage_order

     

...

     

c_storage_order用于指定数组应存储它   元素使用与原始C ++相同的布局   多维数组,即从最后一维到第一维。这个   是此库提供的阵列的默认存储顺序。

在底部:

  

这个库类似于boost :: array,因为它增强了C风格   N维数组,就像boost :: array一样用于C一维数组。

意思是它只是添加了包装器以便于声明和访问,但在引擎盖下它听起来像标准的多维数组。

你尝试过吗?你看到有什么问题吗?

修改

正如之前所指出的,它似乎是一维阵列。但它似乎可以这样访问:

#include <boost/multi_array.hpp>

void f( int * arr )
{
    std::cout << __PRETTY_FUNCTION__ << " start" << std::endl;
    for( int y = 0; y != 2; ++y )
    {
        for ( int x = 0; x != 4; ++x )
        {
            //  std::cout << arr[x][y] << "," ;  // compiler does not like
            std::cout << arr[ x + ( y * 4 ) ] << "," ;
        }
        std::cout << std::endl;
    }

    std::cout << __PRETTY_FUNCTION__ << " end" << std::endl;
}

void multi()
{
    typedef boost::multi_array< int, 2 > arr_t;
    typedef arr_t::index index;

    arr_t a( boost::extents[2][4],  boost::c_storage_order() );

    int v( 0 );

    for ( index i = 0; i != 2; ++i )
        for( index j = 0; j != 4; ++j )
        {
            a[i][j] = ++v;
        }

    v = 0;
    for ( index i = 0; i != 2; ++i )
        for( index j = 0; j != 4; ++j )
        {
            assert( a[i][j] == ++v );
        }

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

    f( a.data() );
}

输出:

1,2,3,4,
5,6,7,8,
void f(int*) start
1,2,3,4,
5,6,7,8,
void f(int*) end