2013-02-27 363 views
6

我们如何在C++的类构造函数中初始化一个std :: vector?我们如何在C++的类构造函数中初始化std :: vector?

class MyClass 
{ 
public: 
    MyClass(int p_Var1, int* p_Vector) : Var1(p_Var1) //, Initialize std::vector - MyVector with p_Vector 
    { 
    }; 
    ~MyClass(void); 
private: 
    int Var1; 
    std::vector<int> MyVector; 
}; 
+0

我以什么方式初始化你的'std :: vector'? (你想使用什么特定形式的构造函数?) – 2013-02-27 08:45:54

+1

这取决于。 “初始化”是什么意思?你正在使用哪种版本的C++标准? – Johnsyweb 2013-02-27 08:45:57

+0

@Mark Garcia用int * p_Vector – CLearner 2013-02-27 08:46:31

回答

10

首先,myVector将被初始化,即使你什么都不做, 因为它具有不平凡的构造函数。如果你想 初始化它给定一个指向序列int的指针,你还需要知道长度。如果你同时拥有指针和 长度,你可以这样做:

: myVector(pInitialValues, pInitialValues + length) 

或者(更惯用),你让呼叫者做 加入,并有构造函数取两个指针, 一开始和结束:(如果呼叫者是使用C++ 11,他可以从 获得这些使用std::begin()std::end()一个C样式数组)

: myVector(pBegin, pEnd) 

编辑:

只是为了使其完全清楚:只是一个int*不提供 足够的信息做任何事情。 int*指向C风格数组的第一个元素 ;您还需要某种方式来寻找结尾:元素计数,结束指针等。在特殊情况下,可以使用其他技术;即如果C风格的 数组仅包含非负数,则可以使用-1作为 一个sentinal,以及诸如: myVector(pVector, std::find( pVector, NULL, -1))之类的东西。然而,这些都是特殊情况。

+1

*因为它有不平凡的构造函数*?它不应该*因为它有默认的构造函数*?并有一个复制构造函数:) – 2013-02-27 09:51:54

+0

@BЈовић不知道究竟应该在那里。形式上,它是一个不平凡的构造函数,可以使用给定的参数调用(或者如果没有指定初始值,则可以使用非平凡的默认构造函数)。然而,实际上,有一些非平凡的构造函数不会初始化数据成员,包括编译器生成的构造函数(例如,如果类具有虚函数)。因此,虽然标准可能会考虑成员“初始化”,但它不会被任何合理含义的词初始化。 (但'矢量'有一个用户定义的ctor,它做正确的事情。) – 2013-02-27 15:39:24