如何使用不同的初始值压缩多个for循环

Spo*_*ock 4 c++

在一个函数中,我有几个连续的for循环,它们具有相同的代码,但控制变量的初始值不同.初始值是从函数的输入获得的.也就是说,

void thisFunction( class A a){
  //some other code

  for (int i = a.x; i != 0; --i){
    code
  }

  for (int i = a.y; i != 0; --i){
    code
  }

  for (int i = a.z; i != 0; --i){
    code
  }

  //some other code
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将所有for循环压缩到一个循环中,这样当我在循环中更改代码时,我不必为所有三个循环更改它?另一种方法是使用初始值作为输入编写anotherFunction(),但我需要访问thisFunction()中的局部变量.

  void anotherFunction(int in){
      for (int i = in; i != 0; --i){
        code
      }
  }
Run Code Online (Sandbox Code Playgroud)

那么还有另一种方法可以压缩循环吗?

谢谢.

MSa*_*ers 9

你的预感是对的 - 你必须将你的代码重构为一个单独的函数.局部变量thisFunction将成为参数anotherFunction; 通常这些将通过引用传递.


Dav*_*eas 7

编辑:在大多数情况下,你应该避免这样做,而是按照MSalter回答.只因为你可以,并不意味着你应该.

我不确定这是多么好的想法,但没有更多的上下文,一个简单的解决方案可能是:

int starts[3] = { a.x, a.y, a.z };
for ( int var = 0; var < 3; ++var ) {
   for ( int i = starts[var]; i != 0; --i ) {
      // code
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,条件的值是在函数开头获得的,这意味着如果对象a在整个第一个循环中发生变化,则在后面的控制循环中将不会看到该变化.如果需要,可以修改解决方案以存储指针.

编辑:有一条评论建议使用数组的大小.我没有在这里添加不修改,但无论如何,获得数组大小的更好方法是:

template<typename T, unsigned int N>
inline unsigned int array_size( T (&)[N] ) {
   return N;
}
//...
for ( int var = 0; var < array_size(starts); ++i ) {
Run Code Online (Sandbox Code Playgroud)

  • @Oli,我更喜欢数组大小的模板化(类型安全)实现.我避免在这里添加不会使代码复杂化,但我现在已经更新了答案. (2认同)