对称迭代一个数组

时间:2013-06-03 19:49:28

标签: c++ c arrays iteration

不确定如何标题,但我希望它有意义。我想向前迭代一个数组,然后向后迭代x次。一种选择是使数组的大小加倍,然后基于模长度迭代,从而以循环方式迭代。假设序列非常大,可能会占用大量不必要的内存。另一种选择是:

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

虽然感觉很难看 - 我有点重复自己,只是改变++ / - 。我正在寻找一种优雅的编码方法。语言应该是C或C ++。为了清楚起见,我正在寻找一种不同的算法。感谢。

5 个答案:

答案 0 :(得分:2)

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 and std::rend,你可以这样写:

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

那就是你正在使用普通数组。大多数标准容器已经带有rbegin()rend()方法,可以为您提供反向迭代器。

答案 1 :(得分:1)

嗯,这是一种不同的方法。但是,根据任何特定标准,不会声称它必然更好。

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;
}

我实际上认为这有点令人费解,维护噩梦等待发生,但至少你不是“重复自己”。它可能在“聪明”的意义上是“优雅的”......在“简单”意义上并非如此。

答案 2 :(得分:1)

这样可以提高效率:

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

示例:当arrayLength5时,j将从0运行到9,相应的k值将会{从04,然后从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);
    }
}

答案 3 :(得分:0)

也许稍好一点?

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]
    }
}

答案 4 :(得分:0)

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 }

}