我需要一个线性矢量容器来表现得像一个多维矢量容器。也就是说,诸如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阵列的索引。如何确保用户传递正确数量的索引(在函数参数中)?此外,在初始化时,用户应该能够指定尺寸(变量参数列表?)。
如果这是一个坏主意,请告诉我,但有充分的理由。如果没有,那么关于如何实现这个类的任何指示都将非常感激。
答案 0 :(得分:4)
您有两种选择:std::valarray
(及其拼接适配器)或boost::multi_array
。
第一个缺少很多东西,并且经常不被使用(它应该值得更多的爱)。第二个很重但很干净。
另外,如果你想对那些野兽做线性代数,你可以看一下Eigen。
我还可以提到英特尔阵列构建模块,这简直太棒了,可能就是你想要的。这取决于你对这些容器的处理方式。