C ++在快速循环退出后“继续”循环:这是一个好习惯吗?

时间:2015-05-26 03:27:29

标签: c++

我将编写一个包含循环的函数,稍后可以通过保存的循环环境继续。以下示例程序是否是一个好习惯(参见下面的代码)?然而,在示例中使用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-- 有些人可能会问我为什么要这样做?是的,这是一个很好的问题:我欢迎在不使用“可继续”循环设计的情况下解决问题的答案。 原谅我糟糕的创造力,如果没有“可以继续”的循环,我无法想到如何做到这一点。

0 个答案:

没有答案