Основываясь на ответах до того, как я создал эту хорошую перегруженную версию оператора вставки для boost :: multi_arrays
using namespace std;
using namespace boost::detail::multi_array;
template <typename T , unsigned long K>
ostream &operator<<( ostream &os , const boost::multi_array<T , K> &A )
{
const T* p = A.data();
for( boost::multi_array_types::size_type i = A.num_elements() ; i-- ; ++p )
{
os << "[ ";
for( boost::multi_array_types::size_type k = 0 ; k < K ; ) {
os << ( p - A.origin() ) / A.strides()[ k ] % A.shape()[ k ]
+ A.index_bases()[ k ];
if( ++k < K )
os << ", ";
}
os << " ] = " << *p << endl;
}
return os;
}
Это просто упрощенная версия ответа 1, за исключением того, что она должна работать с любым типом T, которыйимеет работающего оператора <<.Я тестировал как </p>
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
index x = 3;
index y = 2;
index z = 3;
array_type A( boost::extents[ x ][ y ][ z ] );
// Assign values to the elements
int values = 0;
for( index i = 0 ; i < x ; ++i )
for( index j = 0 ; j < y ; ++j )
for( index k = 0 ; k < z ; ++k )
A[ i ][ j ][ k ] = values++;
// print the results
cout << A << endl;
, и, похоже, это работает:
[ 0, 0, 0 ] = 0
[ 0, 0, 1 ] = 1
[ 0, 0, 2 ] = 2
[ 0, 1, 0 ] = 3
[ 0, 1, 1 ] = 4
[ 0, 1, 2 ] = 5
[ 1, 0, 0 ] = 6
[ 1, 0, 1 ] = 7
[ 1, 0, 2 ] = 8
[ 1, 1, 0 ] = 9
[ 1, 1, 1 ] = 10
[ 1, 1, 2 ] = 11
[ 2, 0, 0 ] = 12
[ 2, 0, 1 ] = 13
[ 2, 0, 2 ] = 14
[ 2, 1, 0 ] = 15
[ 2, 1, 1 ] = 16
[ 2, 1, 2 ] = 17
Надеюсь, это кому-нибудь пригодится, и большое спасибо за оригинальные ответы: это было очень полезно для меня.