gpt4 book ai didi

c++ - Boost.MultiArray 的一行初始化器

转载 作者:可可西里 更新时间:2023-11-01 18:16:25 25 4
gpt4 key购买 nike

我有一个 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);

所以我有 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);

如果不能使用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

关于c++ - Boost.MultiArray 的一行初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com