因为我想使用boost :: multi_array<>,同时,遗留库需要c style 2d数组。
答案 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