在一个函数中,我有几个连续的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)
那么还有另一种方法可以压缩循环吗?
谢谢.
编辑:在大多数情况下,你应该避免这样做,而是按照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)