boost.multiarray用のワンラインイニシャル
-
27-10-2019 - |
質問
私はn次元のブーストを持っています。MultiArray私は次のように初期化します:
const int n=3, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr;
boost::array<size_t,n> extents; //size of each dimension
extents.assign(size); //assign size to each dimension -> {{4, 4, 4}}
arr.resize(extents);
だから、マルチアレイを取得するための4行のコードがありますが、1行でやりたいと思います。それぞれを持っているn寸法でマルチアレイを生成する簡単な方法はありますか size
長さ(だから私は書くことができる arr(samevaluearray(n,size))
)または、マルチアレイの便利なコンストラクターを見逃しましたか?
編集: nの特定の値に依存せずに機能する必要があります。 arr({{size,size}}
のためにのみ機能します n=2
.
明確ではないかもしれないので: boost::multi_array<char,n>(boost::extents[4][4][4])
4x4x4-Arrayを正しく初期化しますが、毎回 n
Sourcodeで変更され、すべての初期化を手で更新する必要があるため、オプションではありません。
解決 2
結局のところ、 std::vector
コンストラクターがあり、一定の値がn回繰り返されるベクトルを構築するため、可能なソリューションは次のようになります。
const int n=2, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr(std::vector<size_t>(n,size));
これにより、各ディメンションのサイズがサイズに設定されたn次元のmulti_arrayが初期化されます。
他のヒント
アレイの作成をヘルパー関数にカプセル化できます。
template <typename T, size_t N>
boost::multi_array<T, N> make_regular_matrix(const size_t m)
{
boost::multi_array<T, N> arr;
boost::array<size_t, N> extents;
extents.assign(m);
arr.resize(extents);
return arr;
}
const int n = 3;
int size = 4; // Can be const as well, but this is not mandatory
auto arr = make_regular_matrix<char, n>(size);
使用できない場合 auto
, 、テンプレートパラメーターを複製する必要があります。
boost::multi_array<char, n> arr = make_regular_matrix<char, n>(size);
make_regular_matrix
機能を短縮することができます std::vector
, 、あなたがあなたの答えでやったように。この実装がより良いかどうかはわかりません。ヘルパー関数の目的は、配列の作成を非表示にすることですが、他のバージョンは、たとえば、特定の値で配列要素を初期化するために記述できます。
template <size_t N, typename T> //switched order for deduction
boost::multi_array<T, N> make_regular_matrix(const size_t m, const T & value)
{
boost::multi_array<T, N> arr(std::vector<size_t>(n, m));
std::fill(arr.data(), arr.data() + arr.num_elements(), value);
return arr;
}
auto arr = make_regular_matrix<4>(3, 'z'); //creates a 3x3x3x3 matrix
//filled with 'z's
から マルチアレイドキュメントをブーストします, 、はい、1つの行を初期化できます。
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
typedefsは読みやすさのためです。例でも簡単に行うことができます。
boost::multi_array<int, 2> arr(boost::extents[2][4]);