我有一个简单的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;
.
.
由于
答案 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);
此示例适用,例如,如果要在多维向量的每个基本元素上执行基本任务。不知道你的算法如何处理矢量,很难对这种技术进行更加量身定制的改编。