线性多维容器

时间:2011-04-17 17:52:00

标签: c++ containers

我需要一个线性矢量容器来表现得像一个多维矢量容器。也就是说,诸如std::vector< std::vector< std::vector<int> > >之类的向量被声明为std::vector<int>,但其行为就好像它是多维的。这要求我设置和获取允许多个索引访问的函数,而不仅仅是一个(即x, y, z而不仅仅是i)。

转换不是问题(即将3D或2D索引转换为1D),我已经这样做了。但是,我开始要求对几个数组进行相同的转换。为了使问题更复杂,我需要一个线性阵列,就像它是2D,3D和4D一样。现在我想制作一个内部负责转换的容器。对于所有意图和目的,容器看起来像是多维的,但实际上它是下面的线性阵列。

所以,首先,我不确定像boost这样的库是否已经实现了类似的东西。如果是这样,请指出我正确的方向。如果没有,那么我想创建一个供我使用,但有一些问题。

我目前的方法是创建一个具有矢量容器的类。有一个GetVec()函数将返回std::vector的地址,这样我就不必编写std::vector已经拥有的所有函数(获取迭代器,大小等) 。

我希望用户能够使用从1-D到N-D的容器。访问时,应允许用户传递可表示1-D阵列或N-D阵列的索引。如何确保用户传递正确数量的索引(在函数参数中)?此外,在初始化时,用户应该能够指定尺寸(变量参数列表?)。

如果这是一个坏主意,请告诉我,但有充分的理由。如果没有,那么关于如何实现这个类的任何指示都将非常感激。

1 个答案:

答案 0 :(得分:4)

您有两种选择:std::valarray(及其拼接适配器)或boost::multi_array

第一个缺少很多东西,并且经常不被使用(它应该值得更多的爱)。第二个很重但很干净。

另外,如果你想对那些野兽做线性代数,你可以看一下Eigen。

我还可以提到英特尔阵列构建模块,这简直太棒了,可能就是你想要的。这取决于你对这些容器的处理方式。