不确定如何标题,但我希望它有意义。我想向前迭代一个数组,然后向后迭代x次。一种选择是使数组的大小加倍,然后基于模长度迭代,从而以循环方式迭代。假设序列非常大,可能会占用大量不必要的内存。另一种选择是:
while(++i <= iterations) {
for(j = 0; j < arrayLength; j++){
//do something
}
for(j = arrayLength - 1; j >= 0; j--){
//do something
}
}
虽然感觉很难看 - 我有点重复自己,只是改变++ / - 。我正在寻找一种优雅的编码方法。语言应该是C或C ++。为了清楚起见,我正在寻找一种不同的算法。感谢。
答案 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);
}
}
示例:当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);
}
}
答案 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 }
}