如何在 C++ 中存储自定义对象矩阵

mm2*_*m24 -5 c++ matrix

我有一个我定义的 C++ 类,并想存储这个类的实例矩阵。有没有人有一些代码示例可以这样做?我找到了带有向量的例子,但我不确定这是否是最好的解决方案,或者是否有一些“更简单”的东西(更像是 Objective-C 风格 -> NSArray * array)。

有什么建议吗?

Iva*_*rop 5

在这个宇宙中,从来不存在“最佳解决方案”。有很多方法可以在 C++ 中呈现矩阵,这完全取决于您的选择。

1. C 风格的天真解决方案

使用多维数组(静态或动态):

MyClass arr[size_y][size_x];

MyClass** arr;
Run Code Online (Sandbox Code Playgroud)

用法:

arr[y][x] = MyClass(a, b, c);  // writing to (x, y)
Run Code Online (Sandbox Code Playgroud)

代码简单,性能差(引用的局部性),容易发生内存泄漏(手动内存管理)和容易出错(例如越界访问)

2. C 风格的解决方案

使用普通数组而不是多维数组。

  MyClass arr[size_y * size_x];
  arr[y * size_x + x] = MyClass(a, b, c); // writing to (x, y)
Run Code Online (Sandbox Code Playgroud)

缓存友好,代码有点难,每次计算索引仍然会泄漏和容易出错。

3.C++程序风格的解决方案

同上,但使用std::array(对于固定大小矩阵)或std::vector(对于动态大小矩阵)而不是普通数组。

std::array<MyClass, size_x * size_y> arr;
arr[y * size_x + x] = MyClass(a, b, c); // writing to (x, y)
Run Code Online (Sandbox Code Playgroud)

缓存友好,没有泄漏,越界仍然存在。

4.面向对象的C++解决方案

使用std::array(对于固定大小矩阵)或std::vector(对于动态大小矩阵)作为底层存储编写(模板化)类。超载operator()

template<class T, size_t rows, size_t cols>
class Matrix
{
    std::array<T, rows * cols> m_Data;
public:
    T& operator()(size_t y, size_t x)
    {
        return m_Data[y * cols + x];
    }

    // more methods go here
}
Run Code Online (Sandbox Code Playgroud)

用法:

 Matrix<MyClass, size_x, size_y> arr;
 arr(x, y) = MyClass(a, b, c); // writing to (x, y)
Run Code Online (Sandbox Code Playgroud)

缓存友好,无泄漏,程序员友好的语法。聪明的!;)

5. 使用一些库

如果你需要一些线性代数的细节,比如稀疏矩阵,或者你只是不想重新发明轮子,去谷歌搜索一些库。以下是一些示例:Boost uBlasArmadilloEigen。智能,方便,但需要一些学习。