我正在尝试以下代码:
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]()
。
答案 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。实现保留以_
开头,后跟大写字母的名称。你不被允许使用它们。