1

このタイトルの付け方がよくわからなかったが、それが意味をなすことを願っている。配列を前方に、次に後方に x 回繰り返します。1 つのオプションは、配列のサイズを 2 倍にしてから、mod の長さに基づいて反復し、循環的に反復することです。非常に大きなシーケンスを想定すると、不要なメモリを大量に消費する可能性があります。別のオプションはこれです:

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

それはただ醜く感じます-私は自分自身を繰り返し、++/--を切り替えるだけです。これに対するエレガントなコーディングアプローチを探しています。言語は C または C++ である必要があります。明確にするために、別のアルゴリズムを探しています。ありがとう。

4

5 に答える 5

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 では、 and もあるのでstd::rbeginstd::rend次のように書くことができます。

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

それは、単純な配列を使用している場合です。ほとんどの標準コンテナーには、逆イテレーターを提供するrbegin()およびメソッドが既に付属しています。rend()

于 2013-06-03T20:13:39.037 に答える
1

これにより、効率が多少犠牲になりますが、エレガンスが得られます。

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

例:arrayLength5の場合、は から までj実行さ09、 の対応する値はからまでk実行され、次に からまで実行されます。0440

編集:あなたの要求に従って、配列内の別のポイントから開始するには、次のようにします:

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);
    }
}
于 2013-06-03T20:38:42.357 に答える
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;
}

実際には少し複雑で、メンテナンスの悪夢が待っていると思いますが、少なくとも「同じことを繰り返している」わけではありません。そして、「賢い」という意味では「エレガント」かもしれませんが、「シンプル」という意味ではそうではありません。

于 2013-06-03T20:33:10.590 に答える