[英]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::rbegin
和std::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);
}
}
示例:當arrayLength
為5
, j
將從0
運行到9
,並且相應的k
值將從0
到4
運行,然后從4
到0
。
編輯:根據您的要求,從陣列中的不同點開始,您可以這樣做:
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.