C++ 阵列类设计:如何在稀疏/密集存储、阵列和子阵列之间共享接口?

C++ 阵列类设计:如何在稀疏/密集存储、阵列和子阵列之间共享接口?,c++,templates,inheritance,C++,Templates,Inheritance,我的目标是创建一个具有密集或稀疏存储的2D数组类,并支持子矩阵 我希望能够拥有密集存储(std::vector)或稀疏存储(std::map) 我还希望能够有几乎使用相同get/set接口的子矩阵 模拟课程如下: struct ArrayBox { int w,h,x,y; bool in_range(...) }; template<class T> struct DenseArray2D { ArrayBox box; std::vector&l

我的目标是创建一个具有密集或稀疏存储的2D数组类,并支持子矩阵
我希望能够拥有密集存储(std::vector)或稀疏存储(std::map)
我还希望能够有几乎使用相同get/set接口的子矩阵

模拟课程如下:

struct ArrayBox
{
    int w,h,x,y;
    bool in_range(...)
};

template<class T>
struct DenseArray2D
{
    ArrayBox box;
    std::vector<T> data;

    T& get(x,y)
    // etc
}

template<class T>
struct SparseArray2D
{
    ArrayBox box;
    std::map<size_t, T> data;

    T& get(x,y)
    // etc, interface identical to above
}
struct ArrayBox
{
int w,h,x,y;
布尔在_范围内(…)
};
模板
结构DenseArray2D
{
阵列盒;
std::矢量数据;
T&get(x,y)
//等
}
模板
结构SparseArray2D
{
阵列盒;
地图数据;
T&get(x,y)
//etc,接口同上
}
现在,我怎样才能在其中添加对子数组的支持,从而尽可能少地编写相同的代码呢?子阵列的唯一区别在于它有一个对数据的引用(在“向量”中给出)和一个不同的框


上述设计当然不是一成不变的,因此欢迎提出任何建议。

如果从多个方面来看设计是“正确的”,那么这可能是一个巨大的(或永无止境的)项目。你为什么不先考虑使用现有的库?我想避免代码膨胀和依赖关系:我需要一个简单的特征集,它可能适合几百行代码。我看,我已经经历了这个阶段几次,我也是这个幻觉的受害者。无论如何,你的问题还是太笼统了,我不知道从哪里开始。就为了一个想法,你可以检查我自己的观点,例如,一维视图及其可能的外观。2D子阵列应该更加复杂,我还没有做到。当然,我有不同的标准。谢谢你的代码!不过对我来说,这显然有点过头了,我有更简单的需求:)顺便说一下,斯特劳斯塔普的经典著作《矩阵设计》第29章可能是一个很好的起点。它与您的目标类似,它是N维的,更通用(但不是稀疏的),像您一样将数据存储在内部向量中,并且仍然适合包含几乎完整代码的章节。