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 v
与 vector* v
之间的内存开销略多,但开销仅为几个字节。但是,vector
具有单独的 size()
和 capacity()
这一事实意味着 vector
可以为 更多 元素分配空间实际上在数组中有效。因此,即使您将 n
vector<int>
元素添加到 vector v
的内部数组,v
可能会为 m
元素分配空间,其中 m > n
.
每当您将元素推入 vector
时,如果其新的 size()
将超过其当前的 capacity()
,则必须重新分配内部数组以使其变大,并且大多数实现将将该数组增加 1.5 倍至 2 倍以提高效率,以避免每次推送时都必须重新分配数组。
这很容易解释您所看到的额外内存使用情况,具体取决于您如何填充vector v
。
我用这两种二维向量加载一个图
在第一种情况下,我使用 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 v
与 vector* v
之间的内存开销略多,但开销仅为几个字节。但是,vector
具有单独的 size()
和 capacity()
这一事实意味着 vector
可以为 更多 元素分配空间实际上在数组中有效。因此,即使您将 n
vector<int>
元素添加到 vector v
的内部数组,v
可能会为 m
元素分配空间,其中 m > n
.
每当您将元素推入 vector
时,如果其新的 size()
将超过其当前的 capacity()
,则必须重新分配内部数组以使其变大,并且大多数实现将将该数组增加 1.5 倍至 2 倍以提高效率,以避免每次推送时都必须重新分配数组。
这很容易解释您所看到的额外内存使用情况,具体取决于您如何填充vector v
。