You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现删除含指定值k的列以生成矩阵的子矩阵(C++无额外库)

C++ 实现createSubMatrix函数解决列删除问题

问题1:删除含k的列后,移位列无法再次检测

你之前用j--无效,核心是遍历逻辑没处理对。比如用普通for循环时,删除列后列数减少,同时后面的列会移到当前j的位置,但循环会自动执行j++,直接跳过了新移过来的列。

正确做法是用while循环控制列索引,手动控制j的增减:

  • 当检测到当前列包含k,删除该列后保持j不变(下一列已经移到当前j的位置,需要重新检查)
  • 当当前列不包含k,再将j++

问题2:缩减矩阵列数(不使用额外库)

如果用的是C++标准库的vector<vector<int>>(这属于原生标准库,不算额外依赖),两种简单实现方式:

  1. 原地修改:直接删除每行中对应列的元素,之后列数自然缩减
  2. 构建新矩阵:先筛选出所有不含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:42:10