初始化向量和标准

时间:2014-05-08 10:52:16

标签: c++ vector std

如果我有一个var

vector<myClass> myVector;

它已经初始化了吗?,也就是说,我可以添加(push_back)inmediately元素,或者我应该按照以下方式调用构造函数?

myVector = vector<myClass>();

另一方面,std::vector<myClass>vector<myClass>是否相同?

3 个答案:

答案 0 :(得分:5)

  

它已经初始化了吗?

是(假设这是std::vector)。与任何理智类一样,它的所有构造函数(包括此处使用的默认构造函数)都将其置于一个定义良好的状态。此时,它是一个有效的空矢量。

  

我应该按照以下方式调用构造函数?

没有调用构造函数(至少不在myVector上)。在对象初始化期间自动调用构造函数;没有办法第二次打电话。这会创建另一个空向量,然后将其复制分配给myVector

  

另一方面,它是否与std :: vector和vector相同?

据推测,这是std::vector,使用邪恶的using namespace std;转储到全局命名空间中。为了避免怀疑,混淆和潜在的暧昧,你应该避免这样做,删除任何流氓使用指令,并始终将其称为std::vector

答案 1 :(得分:2)

在这种情况下

vector<myClass> myVector;

无需单独调用默认构造函数。

您可以拨打push_back和其他方法。

答案 2 :(得分:1)

符号

MyClassType a;

实际调用MyClassType的默认构造函数(如果有)。所以是的,vector已经初始化并可以使用了。 你的第二个片段:

myVector = vector<myClass>();

实际创建一个默认构建的新的临时vector,然后调用myVector的副本分配运算符operator=()

在这方面,C ++与许多其他语言不同。例如,在Java中,您需要执行MyClassType a = new MyClassType()。这在C ++中不是必需的。每当使用自动存储 1 声明类类型的值时,该对象将自动默认构造。对于班级成员也是如此。让我们说你有:

class A {
    std::vector<int> m_myVector;
};

然后无需初始化m_myVector - 只要您实例化类A的对象,它就会自动完成。

在堆上分配对象时会有所不同:

// Note: DON'T use raw pointers in actual code - use smart pointers instead.
// Just for illustration purposes.

// This is just a pointer to an A, it's not yet initialized.
A* myA; 

myA = new A(); 
// now myA points to a heap allocated, default constructed A object.

// Note that you can omit the default constructor's `()` and just write:
myA = new A;

分配对象的堆实际上更接近Java所做的工作。无论如何,在编写适当的C ++时,您很少需要堆分配,而且您不会使用vector进行分配。


1 自动存储:简单地说,您使用C ++创建的任何内容都不使用new/delete或类似内容。