将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
相关产品推荐
相关产品推荐

