我最初问的是使用嵌套的 std::array 创建多维数组,直到运行时才知道维度或范围但这有XY 问题尝试使用 std::array 来完成它。
问题Boost.MultiArray 的一行初始化程序 and 如何使未确定大小的多维数组成为 C++ 中类的成员?他们的答案提供了一些有用的信息,如何使用 Boost::MultiArray 来避免在运行时需要知道维度的范围,但未能演示如何拥有一个可以存储数组(在运行时创建)的类成员,其维度和直到运行时才知道范围。
只是避免多维数组:
template<typename T>
class Matrix
{
public:
Matrix(unsigned m, unsigned n)
: n(n), data(m * n)
{}
T& operator ()(unsigned i, unsigned j) {
return data[ i * n + j ];
}
private:
unsigned n;
std::vector<T> data;
};
int main()
{
Matrix<int> m(3, 5);
m(0, 0) = 0;
// ...
return 0;
}
3D 访问(在适当的 3D 矩阵中)将是:
T& operator ()(unsigned i, unsigned j, unsigned k) {
// Please optimize this (See @Alexandre C)
return data[ i*m*n + j*n + k ];
}
获取任意维度和范围将遵循该方案并添加重载(和维度/范围信息)和/或利用可变参数模板。
您可以避免上面的大量维度(即使在 C++11 中)并将参数替换为 std::vector。例如:T& 运算符(std::向量索引)。
每个维度(除了最后一个维度)都会有一个存储在向量 n 中的扩展(如上面 2D 示例中的第一个维度)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)