我正在尝试实现一系列为三角形或对称矩阵提供(公共(public))接口(interface)的类,但我想避免复制内存(即进行大量就地操作)。
我想用C++做到这一点的方法是实现一个类或结构,该类或结构只是一个包含矩阵数据的 vector (因为我只关心三角矩阵,所以我只需要存储大约一半的矩阵)。我们将此称为“数据承载”类 SquareTriangularMatrix
。现在,根据将数据视为上三角,下三角甚至对称数据的方式,可以不同地访问该矩阵内的数据。
我不认为可以在我的情况下应用多态性,因为我希望的同一对象SquareTriangularMatrix
的对象根据上下文具有不同的接口(interface)。有时 SquareTriangularMatrix
可被视为下三角矩阵,但其他一些可能是其转置:上三角矩阵,依此类推。
有没有解决此问题的设计模式?在此上下文中的任何提示或指导将不胜感激。
非常感谢
最佳答案
您可以为存储类创建适配器类,如下所示:
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
模板(非常简单和广泛)的任何适配器,并在本地扩展任何文件中的适配器列表。您还可以遵循STL允许转换时间(
std::duration_cast
)的方式:template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }
SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);
它的工作方式与上一个示例中的
as<>
函数相同,只是一个口味问题。关于c++ - 单个 “data-carrying”类的各种接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37208507/