实例化一个新的stl向量

时间:2009-06-09 14:47:59

标签: c++ stl

我有一种情况,我有一个指向stl向量的指针

所以喜欢

vector<MyType*>* myvector;

我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载。

如何将其实例化为向量的新实例?

5 个答案:

答案 0 :(得分:7)

假设你正确定义了矢量:

vector<int>*   myvector;  // Note vector must be parametrized with a type.
                          // There is no such thing as a a naked vector.

初始化为NULL

myclass::myclass()
   :myvector(NULL)       // You can use 0 here but I still like NULL because it
{}                       // gives me more information. Waiting for the new keyword.

首次使用时实例化:

myvectr = new vector<int>(100); // reserve some space as appropriate

但是你不应该把RAW指针作为你班级的成员(除非有一个很好的理由)。您需要编写自己的复制构造函数和赋值运算符。

或者你也可以用智能指针包裹'myvector'。或者甚至更好地使它成为正常的矢量。没有必要把它变成指针。

答案 1 :(得分:5)

  

我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载。

     

如何将其实例化为向量的新实例?

我不确定我是否一直了解你。为什么不简单地将向量留空,并设置一个布尔值,说明属性是否已加载?或者,您可以使用boost::optional

boost::optional< vector<MyType*> > 

boost::optional< vector< shared_ptr<MyType> > >

然后,您可以通过取消引用可选对象来简单地接收对象,并像往常一样为其分配向量。

我不会使用指针。它使问题变得复杂,你必须考虑复制包含属性的对象时会发生什么,......

如果你真的必须使用指针,你可以这样做

struct A {
    A():prop() { }
    ~A() { delete prop; }

    vector< MyType *>& get() { 
        if(!prop) prop = new vector< MyType* >();
        return prop;
    }

private:
    // disable copy and assignment. 
    A(A const&);
    A& operator=(A const&);
    vector< MyType* > *prop;

};

或者使用shared_ptr,这将是我的程序中的方式(但是boost :: optional仍然是第一个选项,之后将是vector-and-boolean选项,之后将是以下)

struct A {
    typedef vector< shared_ptr<MyType> > vector_type;

    vector_type &get() { 
        if(!prop) { 
            prop.reset(new vector_type);
        }
        return *prop;
    }

private:
    // disable copy and assignment. 
    A(A const&);
    A& operator=(A const&);
    shared_ptr< vector_type > prop;         
};

复制和分配被禁用,因为它们将共享场景背后的支柱(浅拷贝),应该通过在这些功能中进行深度复制来清楚地记录或禁用。

答案 2 :(得分:1)

myvector = new std::vector<yourtype>;

答案 3 :(得分:1)

你不能有这样的指针:

vector* myvector;

因为vector是一个模板类,必须有一个类型。你可以说:

vector <int> * myvector = 0;

或:

vector <string> * myvector = 0;

然后动态创建一个向量:

myvector = new vector <string>;

答案 4 :(得分:0)

初始化它你需要至少使用该语法将其设置为NULL或类似下面的实例。你也应该按照声明字段的顺序进行,否则可能会发生奇怪的事情。

// Field.
std::vector<int> *myvector;
// Constructor.
myclass() : myvector(new std::vector<int>) 
{ 
}