有沒有辦法迭代一個n維數組(其中n是可變的)沒有使用遞歸?我目前正在使用C++,但我想幾乎任何語言都會有答案。有沒有辦法在不使用遞歸的情況下迭代n維數組(其中n是可變的)?
編輯:其實我真正的問題是有點不同:我其實想枚舉數組的索引。簡單的2D例子,帶有2x2數組:0,0; 0,1; 1,0; 1,1。
有沒有辦法迭代一個n維數組(其中n是可變的)沒有使用遞歸?我目前正在使用C++,但我想幾乎任何語言都會有答案。有沒有辦法在不使用遞歸的情況下迭代n維數組(其中n是可變的)?
編輯:其實我真正的問題是有點不同:我其實想枚舉數組的索引。簡單的2D例子,帶有2x2數組:0,0; 0,1; 1,0; 1,1。
void iterate(const std::vector<int> &dims)
{
std::vector<int> idxs(dims.size());
while (1)
{
// Print
for (int i = 0; i < dims.size(); i++)
{
std::cout << idxs[i] << " ";
}
std::cout << "\n";
// Update
int j;
for (j = 0; j < dims.size(); j++)
{
idxs[j]++;
if (idxs[j] < dims[j]) break;
idxs[j] = 0;
}
if (j == dims.size()) break;
}
}
太棒了!非常感謝! –
我最近寫了這個通用的幫手湊T.
的N×M的陣列template <class T, size_t N, size_t M>
size_t hash(const T (&aa)[N][M])
{
size_t seed = 0;
for (size_t i=0; i<N; i++)
boost::hash_combine(seed, boost::hash_range(aa[i], aa[i]+M));
return seed;
}
您可以用同樣的要點來遍歷數組任意
template <class T, size_t N, size_t M, class F>
void for_each(const T (&aa)[N][M], F func)
{
size_t seed = 0;
for (size_t i=0; i<N; i++)
for (size_t j=0; j<M; j++)
func(aa[i][j]);
}
template <class T, size_t N, size_t M, size_t L, class F>
void for_each(const T (&aaa)[N][M][L], F func)
{
size_t seed = 0;
for (size_t i=0; i<N; i++)
for (size_t j=0; j<M; j++)
for (size_t k=0; k<L; k++)
func(aa[i][j][k]);
}
使用方法如下:
void display(float f) { std::cout << f << std::endl; }
// ...
float fff[1][2][3];
for_each(fff, display);
By * n-dimensional *,我認爲OP建議一個具有3,4,7或更多維度的數組。二維數組是微不足道的。 – karlphillip
這很整齊,但如果n變化很大,則必須編寫相當多的代碼:)另外,您需要在編譯時知道n。 –
是的。失去無需遞送的要求,我們很好。 – sehe
是的 - 請記住C++(或大多數語言)中的任何多維數組只是一個線性區域的記憶。該語言通過自動將任何外部維度索引乘以該維度的大小/偏移量來幫助您。
因此,您可以通過執行語言在編寫array[x][y][z]
時執行的相同算術來「手動」走多維數組 - 但當然,您可以爲任意數量的維度執行此操作。
是的。 如果陣列在內存中「平坦」,則可以從array
重複爲array + n^n
。
請注意,與遞歸相同的解決方案將使用循環+堆棧。 (任何遞歸都可以被翻譯爲循環+堆棧)。
編輯:你以後再editted你的問題:有正好m^N(假定每個維度具有相同數量的元素m
),一個簡單的列舉會0,1,...,(M^N )-1。訪問是通過array + ENUM_NUMBER
。
該數組將如何定義,因爲它們之間存在細微差別,並且它們很重要 – sehe
爲什麼要避免遞歸需求? –