【问题标题】:Space complexity of pushing n elements onto a vector将 n 个元素推入向量的空间复杂度
【发布时间】:2013-12-06 14:49:15
【问题描述】:

假设我的输入大小为 n,这些 n 个元素被推送到一个向量上。

我最近开始学习空间复杂性,但我有点困惑。所以它看的是内存使用情况,但这是动态分配的内存?

vector<int> v; 

虽然这没有使用“new”关键字,但我读到一个向量实际上是在你推送时动态分配的,所以这是否意味着空间复杂度只是 O(n)?

【问题讨论】:

  • vector&lt;int&gt; v; 声明了一个 vector 类型的对象 v 而没有传递任何构造函数参数。这意味着它调用默认构造函数 (cplusplus.com/reference/vector/vector/vector),它分配一个 0 大小的向量。它可能会在内部调用new int[0];(这是一个有效的new 调用)。
  • 另外,如果你知道你会有 n 个元素,你最好(而不是推动)以 n 大小开始向量(调整大小,或使用 1 参数构造函数),然后把中的元素就好像向量是一个int[] 数组一样。
  • @leewangzhong 一个大小为零的向量并不意味着一个容量为 0 的向量。 IIRC,实现可以为默认ctor创建容量> 0。
  • 我的观点是,即使你不从任何元素开始,它也可能会调用 new。

标签: c++ algorithm vector


【解决方案1】:

是的,std::vector 的空间复杂度在其size()(或者实际上是它的capacity())中是线性的。请注意,虽然std::vector 对象本身可以静态或动态分配,但其数据内容将始终动态分配。 (正如@DyP 在 cmets 中指出的那样,分配的实际发生方式取决于您用于向量的分配器。但默认分配器使用动态分配)。

【讨论】:

  • “它的数据内容总是动态分配的” 当使用默认分配器时。
【解决方案2】:

std::vector 的空间复杂度在其大小上是线性的,因为底层结构是 C 数组。

但是,当你声明

std::vector<int> v;

构造了一个空容器。如果发生重新分配,则重新分配本身在整个大小上是线性的。

如果您事先知道数组的大小,则可以使用reserve(),以免每次插入带有push_back() 的元素时(隐式)重新分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多