[英]Contiguous matrix with double subscript operator [][] in c++
我正在尝试实现一个简单的 Matrix 结构,它允许我使用双下标运算符访问它,并保证底层元素连续存储到 memory 中。
到目前为止,我一直在使用std::array<std::array<float, 4>, 4> matrix
。 但据我了解,并不能真正保证元素将连续存储。
所以我想出了这样的事情:
struct RawMatrix4 {
float m[16] = { 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f };
struct Row {
float *m;
int rowIdx4;
const float &operator[](int j) const { return (*this)[j]; }
float &operator[](int j) {
assert(j >= 0 && j < 4);
return m[rowIdx4 + j];
}
};
const Row operator[](int i) const { return (*this)[i]; }
Row operator[](int i) {
assert(i >= 0 && i < 4);
return Row{m, i * 4};
}
};
这允许我创建一个RawMatrix4 m;
然后访问这样的元素m[0][0]
。 由于底层结构是一个包含 16 个元素的数组,我保证这些元素连续存储在 memory 中。
但是我不确定这是最好的方法,我想问问你是否有更好、更有效的方法来实现这一点。 另外,我的代码中有一些分段错误,我无法真正弄清楚。 我将不胜感激任何帮助。 这是一个最小的例子,使用上面的代码,它不起作用: https://godbolt.org/z/nKoo6e6ro 。
感谢评论,我修复了递归调用:
struct RawMatrix4 {
float m[16] = { 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f };
template<typename T>
struct Row {
T *m;
const float &operator[](int j) const {
assert(j >= 0 && j < 4);
return m[j];
}
float &operator[](int j) {
assert(j >= 0 && j < 4);
return m[j];
}
};
const Row<const float> operator[](int i) const {
assert(i >= 0 && i < 4);
return Row<const float>{&m[i * 4]};
}
Row<float> operator[](int i) {
assert(i >= 0 && i < 4);
return Row<float>{&m[i * 4]};
}
};
但是,正如评论中所建议的那样,如果您开始一个新项目,重载float& operator()(size_t i, size_t j)
和float const& operator()(size_t i, size_t j) const
可能会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.