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

时间:2014-05-15 15:46:58

标签: c++ matrix

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

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

这个宇宙中永远不存在“最佳解决方案”。有很多方法可以在C ++中呈现矩阵,这取决于你选择。

<强> 1。 C风格的天真解决方案

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

MyClass arr[size_y][size_x];

MyClass** arr;

用法:

arr[y][x] = MyClass(a, b, c);  // writing to (x, y)

代码简单,性能差(引用的位置),内存泄漏(手动内存管理)和容易出错(例如访问超出范围)

<强> 2。 C风格的解决方案

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

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

缓存友好,lil'难以编码,每次计算索引仍然可能泄漏且容易出错。

第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)

缓存友好,没有泄漏,仍然存在超出范围。

<强> 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
}

用法:

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

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

<强> 5。使用一些lib

如果你需要一些线性代数细节,比如稀疏矩阵,或者你只是不想重新发明轮子,那么去google上一些库。以下是一些示例:Boost uBlasArmadilloEigen。聪明,方便,但需要一些学习。

答案 1 :(得分:1)

您可以通过嵌套容器来创建矩阵,例如C ++ 11 std::array

class Foo {
    /* ... */
};

int main() {
    // Create 3x3 matrix of Foo's.
    std::array<std::array<Foo, 3>, 3> mat;
}

或者使用普通的旧多维数组。

Foo mat2[3][3];

如果您在编译期间不知道大小,请使用std::vector

std::size_t n = 3;
std::size_t m = 3;
std::vector<std::vector<Foo>> mat3(n, std::vector<Foo>(m));

答案 2 :(得分:-3)

如果Foo是您班级的名称,那么这将创建一个矩阵

Foo matrix[4][4]; //for a 4x4 matrix

OR

Foo **matrix;

您可以使用 malloc 对其进行初始化。