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

Posted

技术标签:

【中文标题】C++:向量值在退出 if 语句后重置【英文标题】:C++: Vector value resets efter exiting if-statement 【发布时间】:2021-09-22 17:39:37 【问题描述】:

我需要覆盖 2D 向量中的值,其中新值只是等于我正在计数的整数。但是一旦我退出这个 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 语句

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

Minimalistic test-program:当我运行这个使用基本 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;
        

    

【问题讨论】:

只是为了 100% 确定,您在 if 之后打印出新值,并且即使在确保条件运行之后它也不会改变?提供的代码看起来好像正在运行,并表明错误可能在其他地方 请分享minimal reproducible example。这个问题没有明显的原因。 这是一个来自 OpenCV 库的 Mat 对象,所以 img 本质上更像是一个向量,我猜每个位置都有像素值 @Lala5th 是的,没错 @FrançoisAndrieux 我会说清楚的 【参考方案1】:

这里

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

您正在寻找在-1 之前的0,但您使用-1 填充这些向量,然后是0

【讨论】:

【参考方案2】:

这里:

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

您将-1 分配给所有带有j&lt;120 的元素,并将0 分配给带有j &gt; 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) &amp;&amp; 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;
        

【讨论】:

以上是关于C++:向量值在退出 if 语句后重置的主要内容,如果未能解决你的问题,请参考以下文章

如何向量化包含 if 语句的函数?

jsp页面如何获js中if语句的变量值

java在循环语句的执行语句赋予变量值循环结束后会释放吗?

如何使用“if”语句检查退出状态

如何在 C++ 的条件语句中检查变量类型?

如何重置对象循环“计数器”?