我正在尝试实现一系列为三角形或对称矩阵提供(公共)接口的类,但我想避免复制内存(即进行大量的就地操作)。
我想在C ++中这样做的方法是实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储大约一半的矩阵。 )。让我们称之为“#34;数据携带" class SquareTriangularMatrix
。现在可以不同地访问该矩阵内的数据,这取决于数据应该被视为上三角形,下三角形甚至是对称的。
我不认为在我的情况下可以应用多态,因为我希望 SquareTriangularMatrix
的相同对象具有不同的接口,具体取决于上下文。有时候 SquareTriangularMatrix
可以被视为下三角矩阵,但其他一些可能是它的转置:上三角矩阵,依此类推。
是否有解决此问题的设计模式?在此背景下的任何提示或指南都将非常感激。
非常感谢
答案 0 :(得分:0)
您可以为您的存储类创建适配器类,如:
struct SquareTriangularMatrix {
// constructor, maybe operator[], etc
int* values;
int nrows;
int ncolumns;
};
struct UpperTriangleMatrix {
UpperTriangleMatrix (SquareTriangularMatrix& data): data(data) {}
int at (unsigned row, unsigned column) const {
if (row > column) return 0;
return data.values [row * data.ncolumns + column];
}
private:
SquareTriangularMatrix& data;
};
然后你可以将UpperTriangleMatrix
嵌套在SquareTriangularMatrix
中,并添加一个像SquareTriangularMatrix::as_upper()
这样的函数,它将返回用这个矩阵构造的适配器。
另一种方法是在as
中创建一个函数SquareTriangularMatrix
,以便稍后添加自定义适配器,如下所示:
struct SquareTriangularMatrix {
//...
template <class T> T
as () { return T(*this); }
};
//usage:
SquareTriangularMatrix m;
auto upper = m.as <UpperTriangleMatrix>();
使用这种方法,您可以随时将矩阵转换为您希望满足as
模板的任何适配器(非常简单和广泛),并在本地扩展任何文件中的适配器列表。 / p>
您还可以按照STL允许的方式转换时间(std::duration_cast
):
template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }
SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);
它的工作方式与上一个示例中的函数as<>
的工作方式相同,只是一个品味问题。