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

将C++代码移植到C:如何处理vector与范围for循环?

把C++二分匹配代码移植到C的解决方案

嘿,我帮你一步步搞定这个移植问题,核心就是把C++里的vector邻接表和范围for循环转换成C的写法,同时处理掉字符串输入的差异:

1. 用结构体数组替换vector<int> d[Maxn]

C里没有自动扩容的vector,我们可以用带长度记录的结构体数组模拟邻接表,每个节点的邻接点存在数组里,用size字段跟踪实际元素数量:

#include <stdio.h>
#include <string.h>
#include <stdbool.h> // C99及以后支持bool,若编译器不兼容可替换为int

const int Maxn = 200;

// 模拟vector的邻接表结构
typedef struct {
    int data[Maxn]; // 存储邻接点,Maxn足够覆盖需求
    int size;       // 当前邻接表的有效元素个数
} AdjList;

AdjList d[Maxn]; // 替代原C++的vector<int> d[Maxn]
int par[Maxn];
int rev[Maxn];
bool vs[Maxn];

2. 把范围for循环改成C风格索引遍历

原代码的for (int u : d[i])是遍历d[i]的所有元素,在C里我们直接通过索引循环,遍历邻接表的有效元素:

bool dfs(int i) {
    if (i < 0) return true;
    if (vs[i]) return false;
    vs[i] = true;
    // 替换范围for:遍历d[i]的所有邻接点
    for (int j = 0; j < d[i].size; j++) {
        int u = d[i].data[j];
        if (dfs(rev[u])) {
            par[i] = u;
            rev[u] = i;
            return true;
        }
    }
    return false;
}

3. 替换C++的字符串输入处理

原代码用stringstream拆分输入行,C里我们用fgets读取整行,再用sscanf循环提取数字:

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // 吃掉scanf留下的换行符,避免干扰后续fgets

    // 初始化所有邻接表的size为0
    memset(d, 0, sizeof(d));

    for (int i = 0; i < n; i++) {
        char s[1024]; // 假设每行输入不超过1024字符
        fgets(s, sizeof(s), stdin);
        
        int mk[Maxn];
        // 初始化mk数组为1,将自身和输入的节点设为0
        memset(mk, 1, sizeof(mk));
        mk[i] = 0;

        char* ptr = s;
        int x;
        // 循环提取行内所有整数
        while (sscanf(ptr, "%d", &x) == 1) {
            mk[x] = 0;
            // 移动指针到下一个数字的起始位置
            while (*ptr != '\0' && (*ptr < '0' || *ptr > '9')) ptr++;
            while (*ptr != '\0' && (*ptr >= '0' && *ptr <= '9')) ptr++;
        }

        // 把mk[x]为1的节点加入邻接表
        for (int x = 0; x < n; x++) {
            if (mk[x]) {
                d[i].data[d[i].size++] = x;
            }
        }
    }

    memset(par, -1, sizeof(par));
    memset(rev, -1, sizeof(rev));

    bool ok;
    do {
        ok = false;
        memset(vs, 0, sizeof(vs));
        for (int i = 0; i < n; i++) {
            if (par[i] < 0) {
                ok |= dfs(i);
            }
        }
    } while (ok);

    int ans = 0;
    for (int i = 0; i < n; i++) {
        ans += (par[i] < 0);
    }
    printf("%d\n", ans);

    return 0;
}

关键改动总结

  • 邻接表:用结构体数组模拟vector的存储,d[i].data[d[i].size++] = x替代push_back操作
  • 范围for:换成基于索引的循环,只遍历邻接表的size个有效元素
  • 输入处理:用fgets+sscanf替代C++的stringstream,实现整行数字的提取
  • 类型兼容:用C标准库的stdbool.h支持bool类型,若编译器不兼容可手动替换为int(true=1,false=0)

内容的提问来源于stack exchange,提问作者Elie Kahwaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:58