C++:向量值在退出 if 语句后重置

C++: Vector value resets efter exiting if-statement

我需要覆盖二维向量中的值,其中新值正好等于我正在计算的整数。但是一旦我退出这个 if 语句,该值就会重置为原始值?我认为这可能与索引有关,但我无法弄清楚

所以我用 -1 或 0 填充向量

        vector<vector<int>> P(225, vector<int>(225, 0));

    for (int i = 0; i < 225; i++) {

        for (int j = 0; j < 225; j++) {

            if (img.at<uchar>(i, j) >= 220) {
                P[i][j] = -1;
            }
            else {
                P[i][j] = 0;

            }
        } 
    }

在哪里

img.at<uchar>(i, j)

本质上只是一个我从中检查值的数组,其大小与向量相同。这工作正常

然后我再次遍历向量,检查所有 -1,每次如果 [i][j] 上方或左侧的向量索引为 0,我计算整数“bin” ,我现在想将其作为现货 [i][j]

的值
for (int i = 1; i < 225; i++) {
        for (int j = 1; j < 225; j++) {

           if ((P[i][j - 1] == 0) && (P[i - 1][j] == 0) && P[i][j] == -1) {
                bin++;  
                P[i][j] = bin;
               }
         cout << P[i][j] << endl;
       }

}


但是在它退出 if 语句后,它就忘记了分配给它的新值?我知道 bin 整数也会上升,我已经很好地打印出来了,所以当特定情况发生时,至少应该更改一些矢量值。但它们都只是再次回到 0 和 -1,就好像它从未经过 if 语句

我希望我的解释是可以理解的

简约测试程序:当我运行这段使用基本iostream组件的代码时,同样的问题发生了。我认为这可能是我这边的一个错误

#include <iostream>
using namespace std;

using namespace cv;

int main() {

    int bin = 0;

    vector<vector<int>> P(20, vector<int>(20, 0));

    for (int i = 0; i < 20; i++) {

        for (int j = 0; j < 20; j++) {

            if (j > 15) {
                P[i][j] = 0;
            }
            if (j <= 14 && j >= 9) {
                P[i][j] = -1;
            }
            if (j < 9) {
                P[i][j] = 0;
            }

            
            

            
        }
    }

    for (int i = 1; i < 20; i++) {
        for (int j = 1; j < 20; j++) {

            if ((P[i][j-1] == 0) && (P[i-1][j] == 0) && P[i][j] == -1) {
                bin++;
                P[i][j] = bin;
            }
            cout << P[i][j] << endl;
        }

    }
}

这里

if ((P[i][j - 1] == 0) && P[i][j] == -1) {

您正在寻找 -1 之前的 0,但是您用 -1 后跟 0

填充这些向量

这里:

        if (j > 120) {
            P[i][j] = 0;
        }
        if (j < 120) {
            P[i][j] = -1;
        }
        

您将 -1 分配给具有 j<120 的所有元素,并将 0 分配给具有 j > 120 的元素(j=120 处的元素已经是 0 ).

这意味着您有 P[i][119] == -1P[i][120] == 0:

j --->    ... 119 120 ...
-1 -1 -1 -1 -1 -1  0 0 0 0 0 

然后你试图找到一个元素P[i][j - 1] == 0) && P[i][j] == -1),即一个0后面跟着一个-1,但是这样的元素不存在。

您可以使用调试器或添加一些打印输出来验证这一点:

        if ((P[i][j - 1] == 0) && P[i][j] == -1) {
            std::cout << "this will never be printed, because condition is never true\n";
            bin++;
            P[i][j] = bin;
        }