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] == -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;
}
我需要覆盖二维向量中的值,其中新值正好等于我正在计算的整数。但是一旦我退出这个 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] == -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;
}