把这段代码从C语言改为C++语言 int D[n][n]; for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) D[i][j] = (i == j ? 0 : -1);
时间: 2024-03-09 21:47:59 浏览: 101
在C++中,需要使用动态内存分配来创建二维数组。以下是将此代码转换为C++的方式:
```
int **D = new int*[n];
for(int i = 0; i < n; ++i)
D[i] = new int[n];
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
D[i][j] = (i == j ? 0 : -1);
```
请注意,在C++中,需要在程序结束时手动释放动态分配的内存,以避免内存泄漏。以下是释放内存的代码:
```
for(int i = 0; i < n; ++i)
delete [] D[i];
delete [] D;
```
相关问题
把这段代码从C语言改为C++语言 int q, start, arr[n], queue[n], head, tail, flag; scanf("%d", &q); for(i = 0; i < q; ++i) { for(j = 0; j < n; ++j) arr[j] = 0; scanf("%d", &start); arr[--start] = 1; head = 0, tail = 0; queue[0] = start; while(head <= tail) { for(j = 0; j < n; ++j) if(!arr[j] && canArr[queue[head]][j]) { queue[++tail] = j; arr[j] = 1; } head++; } flag = 0; for(j = 0; j < n; ++j) if(arr[j]) { if(flag) printf(" "); else flag = 1; printf("%d", j+1); } for(int i = 0; i < n; ++i) delete [] D[i]; delete [] D; printf("\n"); }
以下是将代码从C语言改为C++语言的过程:
```cpp
int q, start;
int arr[n], queue[n];
int head, tail, flag;
cin >> q;
for(int i = 0; i < q; ++i) {
for(int j = 0; j < n; ++j) {
arr[j] = 0;
}
cin >> start;
arr[--start] = 1;
head = 0, tail = 0;
queue[0] = start;
while(head <= tail) {
for(int j = 0; j < n; ++j) {
if(!arr[j] && canArr[queue[head]][j]) {
queue[++tail] = j;
arr[j] = 1;
}
}
head++;
}
flag = 0;
for(int j = 0; j < n; ++j) {
if(arr[j]) {
if(flag) {
cout << " ";
} else {
flag = 1;
}
cout << j+1;
}
}
cout << endl;
}
```
主要改动如下:
1. 使用 `cin` 和 `cout` 代替 `scanf` 和 `printf`;
2. 声明变量需要指定类型;
3. 声明数组时需要指定数组大小;
4. 使用 `delete[]` 代替 `free()` 释放内存。
把这段代码从C语言改为C++语言 for(a = 0; a < n; ++a) for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) if(D[i][a] != -1 && D[a][j] != -1) if(D[i][j] == -1 || D[i][a] + D[a][j] < D[i][j]) D[i][j] = D[i][a] + D[a][j]; //Preprocess int canArr[n][n]; for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) canArr[i][j] = 0; for(i = 0; i < n; ++i) { for(j = 0; j < m*2; ++j) if(D[i][terminal[j]] != -1) canArr[i][terminal[j]] = 1; for(j = 0; j < n; ++j) { if(j != i) { if(D[i][j] == -1) continue; for(a = 0; a < n; ++a) if(a != i && a != j) if(D[i][a] != -1 && D[i][a] / k == D[i][j] / k && D[i][a] > D[i][j]) break; if(a == n) canArr[i][j] = 1; } } }
在C++中,可以使用vector代替数组,同时可以使用range-based for循环。以下是将此代码转换为C++的方式:
```
for(int a = 0; a < n; ++a)
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(D[i][a] != -1 && D[a][j] != -1)
if(D[i][j] == -1 || D[i][a] + D[a][j] < D[i][j])
D[i][j] = D[i][a] + D[a][j];
//Preprocess
vector<vector<int>> canArr(n, vector<int>(n, 0));
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m*2; ++j)
if(D[i][terminal[j]] != -1)
canArr[i][terminal[j]] = 1;
for(int j = 0; j < n; ++j)
{
if(j != i)
{
if(D[i][j] == -1)
continue;
int a;
for(a = 0; a < n; ++a)
if(a != i && a != j)
if(D[i][a] != -1 && D[i][a] / k == D[i][j] / k && D[i][a] > D[i][j])
break;
if(a == n)
canArr[i][j] = 1;
}
}
}
```
请注意,由于在C++中,vector的大小可以在运行时动态分配,因此不需要在编译时指定数组大小。
阅读全文