向量的初始化

时间:2018-08-12 21:57:02

标签: c++ stdvector

当我执行以下语句时:

vector <int> v;

v的值到底是什么?

仅仅是指针指向存储块的开始吗?它的值是否为NULL?

有些人指出另一个问题的可能重复之处,而这个问题比这个问题更复杂,而较少关注比较以下问题:1)调用vector类的默认构造函数,以及2)初始化一个我认为是的数组指向int的指针。

3 个答案:

答案 0 :(得分:1)

您的语法将调用不带参数的构造函数,也称为默认构造函数。根据{{​​3}},您可以看到它将创建一个空向量。

它指向的指针无关紧要,因为在容器为空时,您不应该取消引用其值。请注意,如果要存储内部指针的值,例如std::vector constructor documentation,则可以在向向量中添加元素时随时更改(从技术上讲,您可以预测指针何时会更改,但是一种很好的做法,好像指针总是在变化)。

答案 1 :(得分:1)

  

v的值到底是什么?

  • 指针? -不

  • NULL-不。

  • nullptr-不。

v是类 idx vals sel 0 [True, False, True, False] [0, 1, 2, 3] [0, 2] 1 [False, False, False, True] [4, 5, 6, 7] [7] 2 [False, True, True, False] [8, 9, 10, 11] [9, 10] 的实例(其中T是int)。

在Ubuntu Linux 64位上,“ std::vector<T>”占用24个字节,无论

  • sizeof(T),

  • 元素数。

对象的内脏不类似于int数组,但是该实现确实在动态内存中维护了T数组。

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

答案 2 :(得分:0)

vector <int> v;
     

v的值到底是什么?

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

  

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


  

仅仅是指针指向存储块的开始吗?它的值是否为NULL?

向量不是指针。

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