在调整大小时,vector.resize()方法是否调用默认元素构造函数?

时间:2011-09-14 09:10:26

标签: c++ stdvector

我正在尝试以下代码:

struct _Struct2
{
    void   *ptr;
    double dval;
};

struct _Struct
{
    float fval;
    int   ival;
    std::vector<_Struct2>   data;
};

std::vector<_Struct>    vec;


int main()
{
    vec.resize( 9 );
    for ( int i = 0; i < vec.size(); i++ )
    {
        _Struct &elem = vec[i];
        int     len = elem.data.size(); // elem.data is [0]()
    }
}

resize(9)应该分配9个_Struct类型的元素。而且,事实上它是有效的。但是_Struct类型的每个元素都没有被初始化,尤其是数据元素,这是另一个std :: vector。我希望它被初始化为空的std :: vector。必须手动完成吗?我认为resize()方法会调用每个_Struct元素的默认构造函数。 THX

聚苯乙烯。 这里使用的结构名称只是我想到的第一件事。这只是一个例子。我的Visual Studio告诉我,elem.data在调试视图中对应[0]()

聚苯乙烯。 忘记[0]()

1 个答案:

答案 0 :(得分:19)

不,它不会调用默认元素构造函数。 std::vector从不在内部调用默认构造函数(在C ++ 11中,但在规范的早期版本中没有)。

vector::resize的完整签名如下所示

void resize(size_type sz, T c = T());

即。它有第二个参数(默认参数值)。然后将第二个参数用作“源”对象,以通过 copy-constructor 初始化新元素。

换句话说,您对resize的呼叫实际上等同于

vec.resize( 9, _Struct() );

意味着当你将“源”对象提供给vector::resize时,调用了默认构造函数,即使你没有注意到它。

  

但_Struct类型的每个元素都没有初始化,特别是   data元素,这是另一个std :: vector。

咦? “未初始化”?我不知道这应该是什么意思,考虑到在您的示例代码中,resize创建的每个新元素都已完全初始化,如上所述:它是隐式地从_Struct()元素复制初始化的提供给resize作为第二个参数。每个_Struct::fval_Struct::ival都为零,每个_Struct::data都是空向量。

(在原始的C ++ 98中_Struct::fval_Struct::ival将保持未初始化,因为TC1 C ++ 98之前不支持值初始化。但是即使在原始的C ++ 98中,_Struct::data也会初始化为空向量。

  

我希望将它初始化为空的std :: vector。

每个_Struct::data向量已初始化为空向量。是什么让你相信它不是?

P.S。实现保留以_开头,后跟大写字母的名称。你不被允许使用它们。