10

我的代码中有一个块,其中 for 循环应该根据条件向前或向后运行。

if (forwards) {
    for (unsigned x = 0; x < something.size(); x++ ) {
        // Lots of code
    }

} else {
    for (unsigned x = something.size()-1 ; x >= 0 ; x-- ) {
        // Lots of code
    }
} 

有没有一种很好的方法来设置它,所以我不会重复 for 循环中的所有代码两次?

有问题的“东西”是一个 std::vector<>,所以它可能与迭代器一起使用?(我没有使用 C++11 )

4

4 回答 4

15

将循环值与您在循环内使用的值分开:

for (unsigned x2 = 0; x2 < something.size(); x2++ ) {
    const int x = forward ? x2 : (something.size()-1) - x2;
    // Lots of code using x
}
于 2013-10-25T23:27:05.703 回答
6

可能最简单的方法是转换Lots of code为带参数的函数,x并用对该函数的调用替换两个循环体:

void do_lots_of_stuff(unsigned x) {
  // Lots of code
}

////////

if (forwards) {
  for (unsigned x = 0; x < something.size(); x++ ) {
    do_lots_of_stuff(x);
  }
} else {
  for (unsigned x = something.size()-1 ; x >= 0 ; x-- ) {
    do_lots_of_stuff(x);
  }
}
于 2013-10-25T23:27:53.320 回答
4

或者你可以这样做:

for (unsigned x = (forward ? 0: something.size()); x != (forward ? something.size() :0); forward? x++: x-- ) {
    // Lots of code
}

编译器很可能会优化它并且只评估一次,因为它的值在我假设的循环forward中不会改变。for

于 2013-10-25T23:44:29.850 回答
2
template<typename Cont, typename Func>
Func directional_for_each(Cont c, bool forwards, Func f) {
    return forwards ? for_each(begin(c), end(c), f) : for_each(rbegin(c), rend(c), f);
}

像这样使用:

vector<int> v;
// put stuff in v...
bool forwards = false;
directional_for_each(v, forwards, [](decltype(v[0]) x) {
    // Lots of code using x
});

由于您没有使用 C++11,因此必须将包含“使用 x 的大量代码”的 lambda 替换为在其他地方定义的函数。

于 2013-10-25T23:37:24.780 回答