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

为何vector<vector<int>>比vector<int>[]更慢?LeetCode323实践疑问

LeetCode323题:vector[] 对比 vector<vector> 的优势疑问

我在解决LeetCode 323题时,代码思路和官方题解基本一致,唯一区别是我用vector<vector<int>>存储节点邻接表,而官方题解用的是vector<int>[]。我想知道vector<int>[]相对vector<vector<int>>有哪些优势?

我的代码

class Solution {
    public :
    void explore(vector<bool> & visited,vector<int> nei[],int cur){
        visited[cur]=true;
        for(int i=0;i<nei[cur].size();i++){
            if(!visited[nei[cur][i]]){
                explore(visited,nei,nei[cur][i]);
            }
        }
    }
    
public:
    int countComponents(int n, vector<vector<int>>& edges) {
        vector<bool> visited(n);
       vector<vector<int>> neighbors(n);
        int count=0;
        for(int i=0;i<edges.size();i++){
            neighbors[edges[i][0]].push_back(edges[i][1]);
             neighbors[edges[i][1]].push_back(edges[i][0]);
        }
        for(int j=0;j<n;j++){
            if(!visited[j]){
                count++;
                explore(visited,neighbors,j);
            }
        }
        return count;

    }
};

官方题解代码

class Solution { 
public: void dfs(vector<int> adjList[], vector<int> &visited, int src) { 
visited[src] = 1;    

for (int i = 0; i < adjList[src].size(); i++) {
        if (visited[adjList[src][i]] == 0) {
            dfs(adjList, visited, adjList[src][i]);
        }
    }
}

int countComponents(int n, vector<vector<int>>& edges) {
    if (n == 0) return 0;
  
    int components = 0;
    vector<int> visited(n, 0);
    vector<int> adjList[n];

    for (int i = 0; i < edges.size(); i++) {
        adjList[edges[i][0]].push_back(edges[i][1]);
        adjList[edges[i][1]].push_back(edges[i][0]);
    }
    
    for (int i = 0; i < n; i++) {
        if (visited[i] == 0) {
            components++;
            dfs(adjList, visited, i);
        }
    }
    return components;
}
};

vector<int>[]相对vector<vector<int>>的优势

  • 内存访问效率更高:vector<int>[]是固定大小的指针数组,内存上连续分布,每个指针指向对应的vector<int>数据区。而vector<vector<int>>是嵌套容器,内部每个vector的内存是动态分配的,容易产生内存碎片化。遍历邻接表时,连续的指针数组更易被CPU缓存命中,访问速度更快。
  • 写法更贴近经典数据结构模型:邻接表的经典实现是“数组+链表”,vector<int> adjList[n]的写法直接对应这个模型,阅读代码时更直观,一眼就能明确这是n个节点的邻接表。而vector<vector<int>>是容器嵌套,需要多一层理解成本。
  • 函数传参更简洁:将邻接表传给DFS/BFS函数时,vector<int> nei[]的参数写法更简洁,本质是传递数组指针;而vector<vector<int>>&虽然也是引用传递,但语法上多了容器嵌套的层级,对习惯C风格数组的开发者来说,数组形式更符合直觉。

需要注意的是,vector<int> adjList[n]属于变长数组(VLA),这是C99的特性,并非标准C语法(仅部分编译器如GCC支持作为扩展)。而vector<vector<int>>是标准C写法,兼容性更强。但LeetCode的OJ环境支持VLA,所以可以正常运行。

内容的提问来源于stack exchange,提问作者Si Thu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:25:43