2011-07-05 25 views
3

有沒有辦法迭代一個n維數組(其中n是可變的)沒有使用遞歸?我目前正在使用C++,但我想幾乎任何語言都會有答案。有沒有辦法在不使用遞歸的情況下迭代n維數組(其中n是可變的)?

編輯:其實我真正的問題是有點不同:我其實枚舉數組的索引。簡單的2D例子,帶有2x2數組:0,0; 0,1; 1,0; 1,1。

+1

該數組將如何定義,因爲它們之間存在細微差別,並且它們很重要 – sehe

+1

爲什麼要避免遞歸需求? –

回答

5
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; 
    } 
} 
+0

太棒了!非常感謝! –

1

我最近寫了這個通用的幫手湊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); 
+0

By * n-dimensional *,我認爲OP建議一個具有3,4,7或更多維度的數組。二維數組是微不足道的。 – karlphillip

+0

這很整齊,但如果n變化很大,則必須編寫相當多的代碼:)另外,您需要在編譯時知道n。 –

+0

是的。失去無需遞送的要求,我們很好。 – sehe

4

是的 - 請記住C++(或大多數語言)中的任何多維數組只是一個線性區域的記憶。該語言通過自動將任何外部維度索引乘以該維度的大小/偏移量來幫助您。

因此,您可以通過執行語言在編寫array[x][y][z]時執行的相同算術來「手動」走多維數組 - 但當然,您可以爲任意數量的維度執行此操作。

1

是的。 如果陣列在內存中「平坦」,則可以從array重複爲array + n^n
請注意,與遞歸相同的解決方案將使用循環+堆棧。 (任何遞歸都可以被翻譯爲循環+堆棧)。

編輯:你以後再editted你的問題:有正好m^N(假定每個維度具有相同數量的元素m),一個簡單的列舉會0,1,...,(M^N )-1。訪問是通過array + ENUM_NUMBER

相關問題