vector<vector<int> > v 和 vector <int>* v 在内存分配上有什么区别?

What is the difference between vector<vector<int> > v and vector <int>* v in memory allocation?

我用这两种二维向量加载一个图

在第一种情况下,我使用 vector<vector<int> > v 来加载图形邻接矩阵,在第二种情况下,当我使用 vector <int>* v = new vector <int>[n] 初始化它时,我使用 vector <int>* v 来加载它。 (n 是顶点数)。

官方裁判平台显示vector<vector<int> > v占用内存5000多kb,而vector <int>* v只占用3600kb左右。这两种二维向量有什么区别?

如果你能帮助我,我将不胜感激。谢谢。

vector<vector<int> > v(n) 是一个单独的 vector 内部持有指向 n vector<int> 元素数组的指针。

vector <int>* v = new vector <int>[n] 是指向 n vector<int> 元素数组的指针。

在这方面,它们实际上是相同的,只是第一个为您管理数组并在适当的时候自动释放它,而您必须自己管理第二个。

但是,就内存使用而言,这两种方法之间的技术差异在于 vector 必须在内部跟踪与其 size()capacity() 方法相关的元数据,因此使用 vector vvector* v 之间的内存开销略多,但开销仅为几个字节。但是,vector 具有单独的 size()capacity() 这一事实意味着 vector 可以为 更多 元素分配空间实际上在数组中有效。因此,即使您将 n vector<int> 元素添加到 vector v 的内部数组,v 可能会为 m 元素分配空间,其中 m > n.

每当您将元素推入 vector 时,如果其新的 size() 将超过其当前的 capacity(),则必须重新分配内部数组以使其变大,并且大多数实现将将该数组增加 1.5 倍至 2 倍以提高效率,以避免每次推送时都必须重新分配数组。

这很容易解释您所看到的额外内存使用情况,具体取决于您如何填充vector v