tst*_*ner 7 c++ boost boost-multi-array
我有一个n维Boost.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);
Run Code Online (Sandbox Code Playgroud)
所以我有4行代码来获取MultiArray,但我想在一行中完成.是否有任何简单的方法来生成具有n个维度的MultiArray,每个维度都有size
长度(所以我可以写arr(samevaluearray(n,size))
)或者我是否错过了MultiArray的方便构造函数?
编辑:它应该工作,不依赖于n的某个值,即arr({{size,size}}
仅适用于n=2
.
由于可能不太清楚:boost::multi_array<char,n>(boost::extents[4][4][4])
正确初始化4x4x4阵列,但每次n
在源代码中更改时,每次初始化都必须手动更新,因此它不是一个选项.
您可以将数组的创建封装到辅助函数中:
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);
Run Code Online (Sandbox Code Playgroud)
如果您无法使用auto
,则必须复制模板参数:
boost::multi_array<char, n> arr = make_regular_matrix<char, n>(size);
Run Code Online (Sandbox Code Playgroud)
正如您在答案中所做的那样,该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
Run Code Online (Sandbox Code Playgroud)
事实证明,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));
Run Code Online (Sandbox Code Playgroud)
这会初始化n维multi_array,并将每个维度的大小设置为size.