c++ - 每次调用函数时如何在循环中迭代一次?
问题描述
我有循环,每次调用该函数时都想迭代一次。这是我的代码:
#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
解决方案
从您的代码中,它应该是
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;
}
}
}
最好在类中包含所有这些变量以避免可能有问题的静态。就像是:
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));
}
C++20 有协程允许最自然地编写循环。
推荐阅读
- multiprocessing - 重用杀死的生成进程
- dart - 如何使用 Image_picker 和 bloc 更新图像
- android - 如何使用 EditText 过滤 RecyclerView
- reactjs - 使用 React 和 Razzle 在一个或两个组件中应用 SSR(服务器端渲染)
- android - Android:如何在后台获取位置更新
- apache-spark - Spark 2.4 应用程序抛出 parquet 错误
- oracle - 检查 PL/SQL 中的列是否全部为 NULL
- php - 反转字符串中最后一个单词的字母顺序
- arrays - `A 型有什么区别
= T[]`和`类型B = [T]` - python - docker scrapy spyder 不会自动重启