改变
将 vector array[size] 换成 vector<vector> array(size)
解释
vector 的存储分为两部分:vector 对象本身和T 类型的元素数据。
vector 对象本身包含三个成员:
- 一个指向元素数据的指针
- 一个 size(当前元素个数)
- 一个 capacity(已分配的空间大小)
这三个东西大约 24 字节。当 vector 作为局部变量声明时,这个对象本身在栈上;当 vector 作为另一个 vector 的元素时(即 vector<vector> 的外层),它在堆上。
元素数据永远在堆上。指针指向的那块连续内存,是 vector 内部通过 new 分配的,与 vector 对象本身的存放位置无关。
区别
vector array[size] 是一个 C 风格数组,元素类型是 vector。数组本身在栈上,意味着 size 个 vector 对象全部挤在栈上。每个 vector 对象约 24 字节,当 size 较大(比如 10⁶)时,栈空间直接被撑爆,程序崩溃。
vector<vector> array(size) 则不同。外层 vector 对象虽然在栈上,但它的三个成员中,指针指向堆上的一块连续内存,这块内存里存放着 size 个内层 vector 对象。也就是说内层的 vector 对象全部在堆上,不占用栈空间。内层 vector 的指针又各自指向各自的 int 数组,这些 int 数组也在堆上。
换句话说:vector array[size] 是「栈上 size 个 vector 对象 + 堆上的 + 堆上的 size 个 vector 对象 + 堆上的 int 数据」;而 vector<vector> array(size) 是「栈上 1 个 vector 对象 int 数据」。后者把大量 vector 对象从栈搬到了堆,避免了爆栈。
总结
无脑用vector<vector> ,这也是邻接表的标准实现方法