【问题标题】:how to iterate one time over a loop each time call a function? [closed]每次调用函数时如何在循环中迭代一次? [关闭]
【发布时间】:2021-02-15 12:33:58
【问题描述】:

我有循环,每次调用该函数时都想迭代一次。 这是我的代码:

#include <iostream>

void iter(int max_i, int max_j){

        static int i = 0;
        static int j = 0;
        for (; i< max_i; i++ ){
                for(; i<max_j; j++){
                        std::cout << i << " " << j << std::endl;
                        return;
                }
        }
}


int main(){

        iter(4,4);
        iter(4,4);
        iter(4,4);
        return 0;

}

但是结果显示每次调用函数都是从零开始的。

amirreza@time:/tmp$ g++ iterate.cpp 
amirreza@time:/tmp$ ./a.out 
0 0
0 0
0 0

【问题讨论】:

  • 你在递增之前返回,所以ij永远不会改变。
  • 我对您的代码和您的描述“我有循环并想迭代一次...”感到有些困惑。这并不是循环的真正用途。你能澄清一下你想要达到的目标吗?
  • 看起来你想要像协程这样的东西。 en.cppreference.com/w/cpp/language/coroutines 如果您想在每次调用时执行 for 循环的步骤。很不清楚你在问什么......
  • @AmirrezaRiahi 不,由于return,它不会被执行。您想要实现的具体目标是什么,您期望的输出是什么?
  • 我想我明白了。你希望它表现得像一个循环,但每次调用只有一次。 IE。第一次调用 i=0,j=0。第二个 i=0,j=1 等。当 j 达到 max_j 时,它会重置并且 i 递增,等等。出于好奇,当 i 和 j 实际上都达到它们的极限时,你想发生什么?从那以后就成为一个无操作者?

标签: c++ loops iteration static-variables


【解决方案1】:

从你的代码来看,应该是

void iter(int max_i, int max_j){
    static int i = 0;
    static int j = 0;

    if (i < max_i)
    {
        std::cout << i << " " << j << std::endl;
        if (++j >= max_j) {
            ++i;
            j = 0;
        }
    }
}

Demo

最好在类中包含所有这些变量以避免可能有问题的静态。比如:

truct IterData
{
    const int max_i;
    const int max_j;
    int i = 0;
    int j = 0;
};

bool iter(IterData& data){
    std::cout << data.i << " " << data.j << std::endl;
    if (++data.j >= data.max_j) {
        ++data.i;
        data.j = 0;
    }
    return data.i < data.max_i;
}

int main()
{
    IterData data{4, 4};

    while (iter(data));
}

Demo

C++20 有协程,可以最自然地编写循环。

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 2013-04-23
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 2019-12-15
    相关资源
    最近更新 更多