我将编写一个包含循环的函数,稍后可以通过保存的循环环境继续。以下示例程序是否是一个好习惯(参见下面的代码)?然而,在示例中使用goto
:是好还是坏?
我想到的另一种方法是创建一个包含迭代器的类。但是处理所有迭代器代码似乎更复杂。
示例中的 main()
函数仅说明了如何调用“可继续”功能。我的真实代码可能包含其中两个find1()
函数,(例如find1()
和find2()
)。根据具体情况,我选择继续查找过程的功能(在检查find1()
和find2()
的结果关系后)。
#include <iostream>
#include <climits>
using namespace std;
struct IdxPair
{
int i;
int j;
};
// finder predicate function: In the real world, this function could be big.
bool pred(int i, int j)
{
return (i+j == 8);
}
// result generating function: In the real world, this function could be big.
int calc(int i, int j)
{
return i+j;
}
int find1(bool isFirstLoop)
{
int i, j;
static IdxPair toBeContinued;
if (isFirstLoop) {
// It's the first time: setup initial values
i = 0;
j = 0;
} else {
i = toBeContinued.i;
j = toBeContinued.j;
goto continueLoop;
}
// sample loop:
// In the real world, it could be more layer of nested loops.
// The lower/upper limits for i, j could be from functions
for (i=0; i<10; i++) {
for (j=0; j<10; j++) {
cout << "(i, j) = (" << i << ", " << j << ")" << endl;
if (pred(i,j)) {
toBeContinued.i = i;
toBeContinued.j = j;
return calc(i, j); // so-called "fast loop exit"
}
continueLoop:
;
}
}
return INT_MIN;
}
int main()
{
int result=0; // Set it to something other than INT_MIN.
for (result=find1(true); result != INT_MIN; result=find1(false)) {
cout << "result = " << result << endl;
}
cout << "-------------------------------" << endl;
}
- Update-- 有些人可能会问我为什么要这样做?是的,这是一个很好的问题:我欢迎在不使用“可继续”循环设计的情况下解决问题的答案。 原谅我糟糕的创造力,如果没有“可以继续”的循环,我无法想到如何做到这一点。