如何实现删除含指定值k的列以生成矩阵的子矩阵(C++无额外库)
C++ 实现createSubMatrix函数解决列删除问题
问题1:删除含k的列后,移位列无法再次检测
你之前用j--无效,核心是遍历逻辑没处理对。比如用普通for循环时,删除列后列数减少,同时后面的列会移到当前j的位置,但循环会自动执行j++,直接跳过了新移过来的列。
正确做法是用while循环控制列索引,手动控制j的增减:
- 当检测到当前列包含k,删除该列后保持
j不变(下一列已经移到当前j的位置,需要重新检查) - 当当前列不包含k,再将
j++
问题2:缩减矩阵列数(不使用额外库)
如果用的是C++标准库的vector<vector<int>>(这属于原生标准库,不算额外依赖),两种简单实现方式:
- 原地修改:直接删除每行中对应列的元素,之后列数自然缩减
- 构建新矩阵:先筛选出所有不含k的列索引,再遍历原矩阵,只保留这些列的元素到新矩阵
完整实现代码
#include <vector> using namespace std; // 辅助函数:判断指定列是否包含值k bool hasKInColumn(const vector<vector<int>>& mat, int col, int k) { for (const auto& row : mat) { if (row[col] == k) { return true; } } return false; } vector<vector<int>> createSubMatrix(vector<vector<int>> M, int k) { if (M.empty()) return {}; int cols = M[0].size(); int j = 0; while (j < cols) { if (hasKInColumn(M, j, k)) { // 遍历每一行,删除当前列的元素 for (auto& row : M) { row.erase(row.begin() + j); } cols--; // 列数减1,不用j++,继续检查当前位置的新列 } else { j++; // 当前列无k,检查下一列 } } return M; }
代码说明
- 用
while循环遍历列,确保删除列后能重新检查当前位置的新列,不会遗漏 - 调用
row.erase()直接删除每行的指定元素,列数通过cols--同步更新,自然完成列数缩减 - 辅助函数
hasKInColumn单独负责列的检测逻辑,代码更清晰易维护
内容的提问来源于stack exchange,提问作者Gabin Dibango
相关产品推荐
相关产品推荐

