【问题标题】:What is the difference between vector<vector<int> > v and vector <int>* v in memory allocation?vector<vector<int> > v 和vector <int>* v 在内存分配上有什么区别?
【发布时间】:2021-07-30 18:23:39
【问题描述】:

我使用这两种类型的二维向量来加载图形。

在第一种情况下,我使用vector&lt;vector&lt;int&gt; &gt; v 加载图形邻接矩阵,在第二种情况下,当我使用vector &lt;int&gt;* v = new vector &lt;int&gt;[n] 对其进行初始化时,我使用vector &lt;int&gt;* v 来加载。(n 是顶点数) .

在官方评委平台上显示vector&lt;vector&lt;int&gt; &gt; v占用内存超过5000kb,而vector &lt;int&gt;* v仅占用约3600kb。这两种二维向量有什么区别?

如果您能帮我解决这个问题,我将不胜感激。谢谢。

【问题讨论】:

  • n 有多大?你如何填充这些向量?
  • 一个向量需要一些额外的东西,因为它可以做的不仅仅是一个数组,但我不希望它那么多。可以出示一下代码吗?
  • 我这样填充向量:vector&lt;int&gt;* graph = new vector&lt;int&gt;[n];int source = 0, dest = 0;//building undirected graphwhile (cin &gt;&gt; source &amp;&amp; cin &gt;&gt; dest) {graph[source].push_back(dest); graph[dest].push_back(source);}
  • n是100000以下的自然数

标签: c++ memory vector memory-management


【解决方案1】:

vector&lt;vector&lt;int&gt; &gt; v(n) 是一个单一的vector,内部包含一个指向n vector&lt;int&gt; 元素数组的指针。

vector &lt;int&gt;* v = new vector &lt;int&gt;[n] 是指向n vector&lt;int&gt; 元素数组的指针。

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

但是,在内存使用方面,两种方法之间的技术区别在于vector 必须在内部跟踪与其size()capacity() 方法相关的元数据,因此内存开销稍大一些在使用vector vvector* v 之间,但开销只有几个字节。然而,vector 具有独立的size()capacity() 这一事实意味着vector 可以为数组中实际有效的更多 元素分配空间。因此,即使您将n vector&lt;int&gt; 元素添加到vector v 的内部数组,v 也可能为m 元素分配空间,其中m &gt; n

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

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

【讨论】:

  • 非常感谢。?
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2021-08-26
  • 2022-01-13
  • 1970-01-01
  • 2021-11-07
  • 2020-12-27
  • 2020-07-15
相关资源
最近更新 更多