在这个宇宙中永远不存在“最佳解决方案”。有很多方法可以在 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)
缓存友好,编码有点困难,每次计算索引仍然会泄漏和容易出错。
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.使用一些库
如果您需要一些线性代数细节,例如稀疏矩阵,或者您只是不想重新发明*,请去谷歌搜索一些库。以下是一些示例:Boost uBlas、Armadillo、Eigen。智能、方便,但需要一些学习。