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<120
的元素,并将0
分配给带有j > 120
的元素(j=120
的元素已经是0
)。
这意味着你有P[i][119] == -1
和P[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;
【讨论】:
以上是关于C++:向量值在退出 if 语句后重置的主要内容,如果未能解决你的问题,请参考以下文章