在运行时更改为n维

时间:2014-12-06 15:48:25

标签: c++

我有一个简单的C ++代码,如下所示。我需要为n维做一个特定的任务。但是n i的值只会在runt-time期间得到。如何在运行时将代码与向量一起传递给n个维数。

    //one dimesion
    std::vector<int> a;
    // do some task with a;

   // two dimension
    std::vector< std::vector<int> > a;
    // do some task with a;
    .
    .

由于

2 个答案:

答案 0 :(得分:0)

您可以使用单个矢量实现n维数组。

这样的工作原理如下:

假设您的数组(A[s1])是一维的。然后访问数组元素,如A[i1]

如果您的数组是二维的(A[s1][s2]),则首先存储元素A[0][0]A[0][s2-1],然后A[1][0]A[1][s2-1]。请注意,所有元素都按顺序存储在单个向量中。因此,像A[ i1*s2 + i2 ]一样访问数组元素。

对于三维数组A[s1][s2][s3],您可以将其视为二维数组的s1数。首先存储A[0]处的二维数组,然后存储A [1]处的下一个二维数组,依此类推。因此可以使用A[ i1*s2*s3 + i2*s3 + i3]访问元素。

具有'n'维度的数组,可以在[i1] [i2] [i3] ... [in]中访问其元素:

my_vector[ i1*(s2*s3*...*sn) + i2*(s3*s4*...*sn) + i3*(s4*...*sn) + ... + in ]

其中s1,s2,s3,...,sn分别是第1,第2,......,第n维的大小。

答案 1 :(得分:0)

如果你想在多维向量上定义通用算法而不知道它们的维度(参见问题的评论),你可以继续使用递归模板,如下面的简单例子所示:

template <typename T>
void myalgo(T v)       // generic algorithm 
{
    myalgo_imp(v, static_cast<T*>(0));  // trick to distinguish vectors from non vectors
}

template <typename T>
void myalgo_imp(vector<T> cplx, vector<T> *)   // vector implementation
{
    for (T x : cplx)          // Reaply the generic algorithm to the dimension less 1 
        myalgo (x);
}

template <typename T >
void myalgo_imp(T base, T*)   // Apply the generic algorithm for base class (non vector) 
{
    cout << base << endl;
}

静态演员的技巧在this SO question中解释:
然后,您可以按照要求使用该算法:

//one dimesion
std::vector<int> a(3);
myalgo(a); 

// two dimension
std::vector< std::vector<int> > aa(3, vector<int>(2,1));
myalgo(aa);

此示例适用,例如,如果要在多维向量的每个基本元素上执行基本任务。不知道你的算法如何处理矢量,很难对这种技术进行更加量身定制的改编。