繁体   English   中英

c++ 中具有双下标运算符 [][] 的连续矩阵

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM