当 j 越界或循环条件没有满足时,boundRect_comb_3d[j] 可能会访问到无效的位置。确保在循环之前或内部正确处理边界情况。 删除元素后,j 变量可能需要更新,因为 erase 函数改变了容器的大小。 如何修改
时间: 2024-10-23 12:20:46 浏览: 12
确实,当 `j` 超出范围或者循环内的条件未满足时,尝试访问 `boundRect_comb_3d[j]` 可能会导致运行时错误。为了修复这个问题,可以添加适当的边界检查和条件判断。这里是改进后的代码段:
```cpp
for (int i = 0; i < boundRect_comb.size(); i++) {
std::cout << "2d整理窗口" << boundRect_comb[i] << std::endl;
// ... 其他代码 ...
int j = 0; // 初始化一个索引用于遍历 boundRect_comb_3d
while (j < boundRect_comb_3d.size() && !compareRect(boundRect_comb[i], boundRect_comb_3d[j])) {
if (abs(boundRect_comb[i].x - boundRect_comb_3d[j].x) < 200 &&
abs(boundRect_comb[i].y - boundRect_comb_3d[j].y) < 200 &&
abs(boundRect_comb[i].y - boundRect_comb[i].height - (boundRect_comb_3d[j].y - boundRect_comb_3d[j].height)) < 200 &&
abs(boundRect_comb[i].x - boundRect_comb[i].width - (boundRect_comb_3d[j].x - boundRect_comb_3d[j].width)) < 200) {
boundRect_cfip.emplace_back(boundRect_comb[i]);
boundRect_comb_3d.erase(boundRect_comb_3d.begin() + j); // 更新 j 以反映已删除元素
break;
}
j++;
}
// 如果没有找到匹配,可以选择跳过剩余的 boundRect_comb_3d 遍历
if (j == boundRect_comb_3d.size()) {
continue;
}
}
```
现在,循环会在找到匹配元素并删除后,自动递增 `j` 的值,确保不会访问到已经移除的元素位置。如果整个 `boundRect_comb_3d` 都没有找到匹配,`j` 将保持原样,表示没有多余的迭代。
阅读全文