【问题标题】:Initialization of vectors向量的初始化
【发布时间】:2018-08-12 21:57:02
【问题描述】:

当我执行以下语句时:

vector <int> v;

v 的值究竟是多少?

它只是一个指向内存块开头的指针吗?它的值会是NULL吗?

一些点可能重复到另一个比这个更复杂的问题,并且较少关注1)调用vector类的默认构造函数和2)我认为是指针的数组的初始化到int

【问题讨论】:

  • A) 值是空向量 B) 为什么需要知道内部指针是否为空?
  • @Borgleader 也许是因为 OP 习惯于 C ?
  • 它的值将是vector &lt;int&gt; 类型的实例。它确实包含一个int 类型的指针,该指针将设置为nullptr(如果向量为ints 分配了一些内存,则可以稍后指向缓冲区)但您不必担心使用时它。有关std::vector 提供的接口的更多信息,请参阅docs
  • 一个大小为0,容量为0以上的向量。内部管理的方式由实现定义。
  • @Aconcagua 已回复here

标签: c++ stdvector


【解决方案1】:

您的语法将调用不带参数的构造函数,也称为默认构造函数。根据std::vector constructor documentation,可以看到会创建一个空向量。

它指向的指针无关紧要,因为当容器为空时,您不应该取消引用它的值。请注意,如果您想存储内部指针的值,例如std::vector::data(),它可能会在您向向量中添加元素时随时更改(嗯,从技术上讲,您可以预测指针何时会更改,但这是一个很好的练习就像指针总是在变化一样)。

【讨论】:

    【解决方案2】:

    v 的值究竟是多少?

    • 指针? - 不。

    • NULL - 没有。

    • nullptr - 没有。

    v 是类 std::vector&lt;T&gt; 的一个实例(其中 T 是 int)。

    在 Ubuntu Linux 64 位上,“std::vector&lt;T&gt; tVec;”不管怎样都占用 24 个字节

    • sizeof(T),

    • 元素数量。

    对象的内脏类似于int数组,但实现确实维护了一个T数组,可能在动态内存中。

    对于每个编译器,实现可能会有所不同。

    【讨论】:

      【解决方案3】:
      vector <int> v;
      

      v 的值究竟是多少?

      这是默认初始化的语法。因此,对象将处于默认的初始化状态。对于std::vector 等类类型,默认初始化调用默认构造函数。 An online reference 这样描述了vector的默认构造函数:

      1) 默认构造函数。构造一个空容器。如果没有提供分配器,则分配器是从默认构造的实例中获取的。


      它只是一个指向内存块开头的指针吗?它的值会是NULL吗?

      向量不是指针。

      在其他成员中,向量实现确实包含一个指针,该指针可能指向向量管理的缓冲区 - 您可以使用 std::vector::data 成员函数获取该指针的副本。默认初始化向量的内部指针的状态是未指定。由于空向量不需要缓冲区,因此该指针可能为空 - 但不是必需的。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        相关资源
        最近更新 更多