如何从C++到C移植代码。
我正在尝试移植到C。因为C中没有向量,所以我使用了一个普通数组,但我不知道如何处理第18行的远程循环如何从C++到C移植代码。,c++,c,C++,C,我正在尝试移植到C。因为C中没有向量,所以我使用了一个普通数组,但我不知道如何处理第18行的远程循环 for (int u : d[i]) if (dfs(rev[u])) { par[i] = u; rev[u] = i; return true; } 完整代码: #include <iostream> #include <vector> #include <string> #include
for (int u : d[i]) if (dfs(rev[u])) {
par[i] = u;
rev[u] = i;
return true;
}
完整代码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
const int Maxn = 200;
vector<int> d[Maxn];
int par[Maxn];
int rev[Maxn];
bool vs[Maxn];
bool dfs(int i) {
if (i < 0) return true;
if (vs[i]) return false;
vs[i] = true;
for (int u : d[i]) if (dfs(rev[u])) {
par[i] = u;
rev[u] = i;
return true;
}
return false;
}
int main() {
ios_base::sync_with_stdio(false);
int n;
cin >> n;
string s;
getline(cin, s);
for (int i = 0; i < n; i++) {
getline(cin, s);
stringstream ss(s);
vector<int> mk(n, 1);
mk[i] = 0;
int x;
while (ss >> x)
mk[x] = 0;
for (int x = 0; x < n; x++)
if (mk[x])
d[i].push_back(x);
}
memset(par, -1, sizeof par);
memset(rev, -1, sizeof rev);
for (bool ok = true; ok; ) {
ok = false;
memset(vs, 0, sizeof vs);
for (int i = 0; i < n; i++)
if (par[i] < 0) {
ok |= dfs(i);
}
}
int ans = 0;
for (int i = 0; i < n; i++)
ans += (par[i] < 0);
cout << ans;
}
假设d[i]是一个向量,这是一个类似的循环:
for (size_t s = 0; s < d[i].size(); s++)
{
int u = d[i][s];
if (dfs(rev[u]))
{
par[i] = u;
rev[u] = i;
return true;
}
}
在C语言中,没有std::vector,闭包将是一个数组
int array[] = [ 1, 3, 5, 7, 9 ];
for(int i = 0; i < sizeof array / sizeof *array; ++i)
printf("array[%d] = %d\n", i, array[i]);
编辑2
我注意到您已经发布了代码,并且d被声明为向量d[Maxn];。同时考虑到你最近的评论
这是一个向量数组。你知道我如何在C语言中使用数组吗
有两种方法可以转换C中的向量数组,但这取决于
根据你的需要。例如,如果你知道所有向量都有
相同大小,例如int vectsize=100,则可以创建一个两个
大小为1的多维数组
您可以创建指向int的指针数组,但必须保留
另一个int数组,长度为每个d[i]向量
但是,在某些情况下,您必须释放内存:
for(int i = 0; i < Maxn; ++i)
free(d[i]);
在这种情况下,范围循环看起来与指针数组完全相同。
不过,释放内存有点不同:
for(int i = 0; i < Maxn; ++i)
free(d[i]);
free(d);
free(vectsize);
它们也可能含有少于n种元素。这就是为什么我认为第三个
这里的解决方案更可取
注释
1在C99之前,不支持可变长度数组VLA,因此如果您有
在变量中,必须使用malloc来分配足够的内存。
C99支持VLA,但我不确定它们的支持程度和/或
您的编译器是否支持它们
我个人根本不在我的代码中使用它们,这就是为什么我真的不知道。我用GNU编译了这个例子
GCC6.4.0在linux上运行,运行良好
前两个选项使用VLA,如果编译器不支持,那么
您必须使用第三个选项
有关VLAs的更多信息:
以防你不知道
<> P> 2.如何真正获得这个值取决于原始C++代码。
到目前为止,我只对你的C++代码进行了简单的研究。使用中的值
我的示例get_length_for 0将返回10,get_length_for 1将返回1,
get_length_for 2将返回3,等等。请不要在其他网站上发布带有代码的链接,请在您的问题中在此发布代码。对于int u=0;u
// assuming that the variables i, par, rev are valid, i between 0 and Maxn-1
for(int j = 0; j < vectsize; ++j)
{
int u = d[i][j];
if (dfs(rev[u])) {
par[i] = u;
rev[u] = i;
return true;
}
}
d[0].size() --> 10
d[1].size() --> 1
d[2].size() --> 3
...
int Maxn = 200;
int *d[Maxn]; // pointer to int[Maxn] arrays
int vectsize[Maxn];
// initializing with 0
memset(d, 0, sizeof d);
memset(vectsize, 0, sizeof vectsize);
// filling the data
for(int i = 0; i < Maxn; ++i)
{
vectsize[i] = get_length_for(i);
d[i] = malloc(vectsize[i] * sizeof *d[i]);
if(d[i] == NULL)
// error handling
for(j = 0; j < vectsize[i]; ++j)
d[i][j] = get_value_for(i, j);
}
// assuming that the variables i, par, rev are valid, i between 0 and Maxn-1
for(int j = 0; j < vectsize[i]; ++j)
{
int u = d[i][j];
if (dfs(rev[u])) {
par[i] = u;
rev[u] = i;
return true;
}
}
for(int i = 0; i < Maxn; ++i)
free(d[i]);
int Maxn = get_some_maxn_value();
int **d, *vectsize;
d = malloc(Maxn * sizeof *d);
if(d == NULL)
// error handling
vectsize = malloc(Maxn * sizeof *vectsize);
if(vectsize == NULL)
// error handling,
// if you exit the function, don't forget
// to do free(d) first as part of the
// error handling
// initialize all elements with 0
memset(d, 0, Maxn * sizeof *d);
memset(vectsize, 0, Maxn * sizeof *vectsize);
// filling the data (the same as above)
for(int i = 0; i < Maxn; ++i)
{
vectsize[i] = get_length_for(i);
d[i] = malloc(vectsize[i] * sizeof *d[i]);
if(d[i] == NULL)
// error handling
for(j = 0; j < vectsize[i]; ++j)
d[i][j] = get_value_for(i, j);
}
for(int i = 0; i < Maxn; ++i)
free(d[i]);
free(d);
free(vectsize);
if (mk[x])
d[i].push_back(x);