使得n维收集的基础知识会是这样的。它假定容器不能被重新调整尺寸。
template< typename T >
class MultiDimContainer
{
std::vector<size_t> dims;
std::vector<T> data;
public:
MultiDimContainer(const std::vector<size_t> dims)
{
// work out the product of dims and set data to that size
}
T& at(const std::vector<size_t> & dim)
{
// calculate where it lives in memory and return that element
}
};
正如我已经在()采用一个参数,你可以使用operator []来实现这个。你可能会想要2重载,一个const和一个非const,并且at()会检查边界,而operator []不会。您可能需要一个帮助器(非模板)函数来计算数据向量中此元素的位置。
当然,构建矢量是一个多步骤的过程,所以你可以使用一些魔法类来构造一个。
您也可以让operator []为您的容器取一个size_t并返回一个ContainerReferencer对象。这不是一个真正的多维数组,而是其他地方的数据片。再次可以有const或非const版本。
使用此模型不可能获取operator []的多个调用以过滤到T value_type或对其引用。
这将有可能使用一个硬尺寸的数组,这可能是一个模板参数。所以,如果你知道它是4维,你会称它为
MultiDimCollection <双,4>
,它总是有4个维度。然后你可以让运算符[]返回一个MultiDimCollectionReference < double,3>
这将会下降到2和1(一个向量),那么这将专门返回一个标量。
顺便说一句,你为什么需要这样的容器?考虑boost :: array或boost :: multi_array怎么样? – upriser 2010-11-22 17:27:07