C++中dijkstra函数传入用户自定义二维数组参数报错如何解决
报错原因
你当前代码的核心问题是使用了**变长数组(VLA)**语法:即使用运行时输入的变量V定义数组长度(比如int graph[V][V]、string city[V]),该语法是C语言标准的内容,不属于标准C++规范,仅GCC等少数编译器将其作为扩展支持,这也是你二维数组传参报错的根本原因。
标准C++的动态二维数组传参方案
最推荐的方案是用C标准库的vector容器替代原生数组,完全符合C标准,所有编译器都兼容,不需要依赖编译器扩展。
修改后的完整代码如下:
#include <bits/stdc++.h> using namespace std; int minValueIndex(vector<int>& value, vector<bool>& processed, int V) { int minimum = INT_MAX; int ver = 0; for (int i = 0; i < V; ++i) { if (processed[i] == false && value[i] < minimum) { ver = i; minimum = value[i]; } } return ver; } // 二维数组参数替换为vector<vector<int>>,城市数组替换为vector<string> void dijkstra(int V, vector<vector<int>>& graph, int a, int b, vector<string>& city) { vector<int> parent(V); // 替换变长数组为vector vector<int> value(V, INT_MAX); vector<bool> processed(V, false); int src = a, d = b; parent[src] = -1; value[src] = 0; for (int i = 0; i < V - 1; ++i) { int index = minValueIndex(value, processed, V); processed[index] = true; for (int j = 0; j < V; ++j) { if (graph[index][j] != 0 && processed[j] == false && value[index] != INT_MAX && (value[index] + graph[index][j] < value[j])) { value[j] = value[index] + graph[index][j]; parent[j] = index; } } } vector<string> arr(V); // 替换变长数组为vector int temp = d; int count = 0; while (d != src) { arr[count] = city[parent[d]]; d = parent[d]; count++; } for (int i = count - 1; i >= 0; i--) cout << arr[i] << "->"; cout << city[temp]; cout << endl; cout << "Happy Journey!!\n"; } int main() { int V; cout << "Enter Total Cities\n"; cin >> V; vector<string> city(V); // 替换变长数组为vector cout << "Enter Cities\n"; for (int i = 0; i < V; i++) cin >> city[i]; cout << "Distance Matrix" << endl; vector<vector<int>> graph(V, vector<int>(V)); // 替换变长二维数组为vector for (int i = 0; i < V; i++) for (int j = 0; j < V; j++) cin >> graph[i][j]; cout << "Enter Source\n"; string src, des; int a = 0, b = 0; cin >> src; cout << "Enter Destination\n"; cin >> des; for (int i = 0; i < V; i++) { if (city[i] == src) a = i; if (city[i] == des) b = i; } dijkstra(V, graph, a, b, city); return 0; }
其他可选方案
如果不想使用vector,也可以用一维数组手动模拟二维数组的内存布局:
- 申请长度为
V*V的一维数组存储矩阵,按行优先规则访问:graph[i*V + j]对应原二维数组的graph[i][j] - 传参时直接传一维数组的首地址
int* graph即可,该方法也符合C++标准,但是代码可读性低于vector方案。
注意事项
如果一定要保留原VLA写法,仅在GCC编译环境下可以将函数签名修改为void dijkstra(int V, int (*graph)[V], int a, int b, string city[])即可解决传参报错,但该写法不兼容其他编译器,不推荐在跨平台项目中使用。
内容的提问来源于stack exchange,提问作者Sana Mev
相关产品推荐
相关产品推荐

