簡體   English   中英

對稱迭代一個數組

[英]Iterating An Array Symmetrically

不確定如何標題,但我希望它有意義。 我想向前迭代一個數組,然后向后迭代x次。 一種選擇是使數組的大小加倍,然后基於模長度迭代,從而以循環方式迭代。 假設序列非常大,可能會占用大量不必要的內存。 另一種選擇是:

while(++i <= iterations) {
    for(j = 0; j < arrayLength; j++){
        //do something
    }
    for(j = arrayLength - 1; j >= 0; j--){
        //do something
    }
}

這只是感覺很難看 - 我有點重復自己,只是改變++ / - 。 我正在尋找一種優雅的編碼方法。 語言應該是C或C ++。 為了清楚起見,我正在尋找一種不同的算法。 謝謝。

boost::adaptors::reverse可以派上用場:

#include <boost/range/adaptors.hpp>

while (i++ < iterations) {
    for (auto i : array) /* do something */ ;
    for (auto i : boost::adaptors::reverse(array)) /* do something */ ;
}

在C ++ 14中,我們還將有std::rbeginstd::rend ,你可以這樣寫:

auto rb = std::rbegin(array);
auto re = std::rend(array);
while (rb != re) {
    // do something
    ++rb;
}

那就是你正在使用普通數組。 大多數標准容器已經附帶了rbegin()rend()方法,可以為您提供反向迭代器。

嗯,這是一個不同的方法。 但是,根據任何特定標准,不會聲稱它必然更好。

int dir = 1;
int start = 0, end = arrayLength - 1;

while (++i <= (iterations << 1))
{  int j = start;

   do
   { // something
     j += dir;
   } while (j != end);

   dir = -dir;
   int tmp = start; start = end; end = tmp;
}

我實際上認為這有點令人費解,維護噩夢等待發生,但至少你不是“重復自己”。 它可能在“聰明”的意義上是“優雅的”......在“簡單”意義上並非如此。

這樣可以提高效率:

while(++i <= iterations) {
    for(j = 0; j < twiceArrayLength; ++j) {
        k = min(j, arrayLengthMinusOne) - max(0, j - arrayLength);
        doSomething(k);
    }
}

示例:當arrayLength5j將從0運行到9 ,並且相應的k值將從04運行,然后從40

編輯:根據您的要求,從陣列中的不同點開始,您可以這樣做:

while(++i <= iterations) {
    endPoint = startPoint + twiceArrayLength;
    for(j = startPoint; j < endPoint; ++j) {
        jModTwiceArrayLength = j % twiceArrayLength;
        k = min(jModTwiceArrayLength, arrayLengthMinusOne) - max(0, jModTwiceArrayLength - arrayLength);
        doSomething(k);
    }
}

也許稍好一點?

j = -1;

while(++i <= iterations) {
    while(++j < arrayLength){
        //do something
    }
    while(--j >= 0){
        //do something
    }
}

或者,您可以同時對元素進行操作嗎?

while(++i <= iterations) {
    for(j = 0; j < arrayLength; j++){
        //do something with array[j]
        //do something with array[arrayLength - j - 1]
    }
}
while(++i <= iterations)
{
   for(auto it = array.begin(); it!=array.end(); ++it)
   { //do something }

   for(auto it = array.rbegin(); it!=array.rend(); ++it)
   { //do something }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM