C++为什么struct对象值在循环结束时重置为ZERO

Lie*_*ven 2 c++ struct list sudoku

我创建了一个简单的结构对象,它包含2个值 - 数字(特定数字)和计数(计数出现次数的计数器).

typedef struct matrixMissNumber {
  int number;
  int count = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个名为missingNumsObjects的列表来保存这些对象.missNums是一个单独保存整数的单独列表.

list<matrixMissNumber> missingNumsObjects;
for (auto m : missNums)
{
    matrixMissNumber mn;
    mn.number = m;
    missingNumsObjects.push_back(mn);
}
Run Code Online (Sandbox Code Playgroud)

然后我有3个for循环通过并检查2个条件.如果满足这些条件,则将计数增加1.(我为测试目的添加了一个cout语句).我调试了程序,一切都很完美,直到循环结束.那时,missingNumsObjects中每个matrixMissNumber对象的count变量重置为0.我不确定是否存在操作不同内存地址的问题,或者列出了问题的指针.

for (auto m : missingNumsObjects)
{
    for (int x = 0; x < 3; x++)
    {
        for (int y = 0; y < 3; y++)
        {
            if (sudoku[x][y] == 0)
            {
                if (checkRowRule(m.number, x) == false && checkColumnRule(m.number, y) == false)
                {
                    m.count++;
                    cout << m.number << " - " << m.count << endl;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下一行打印出循环后missingNumsObjects的count值.这是值返回0的位置.

for (auto m : missingNumsObjects)
    cout << m.number << " - " << m.count << endl;
Run Code Online (Sandbox Code Playgroud)

该程序的目的是数独求解器.算法的这一部分检查3x3矩阵是否缺少数字,并检查3x3矩阵中有多少空点可以进入.

Edg*_*jān 11

for (auto m : missingNumsObjects)
Run Code Online (Sandbox Code Playgroud)

这里auto推断为matrixMissNumber,列表中存储mmatrixMissNumber对象的副本也是如此.然后更改副本,而不是列表中的对象missingNumsObjects.

解决此问题有助于编译器正确推断类型并将周期更改为:

for (auto& m : missingNumsObjects)
Run Code Online (Sandbox Code Playgroud)