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

C++ 调整大小时,vector.resize()方法是否调用默认元素构造函数?,c++,stdvector,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

我正在尝试以下代码:

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]()
    }
}
struct\u Struct2
{
无效*ptr;
双dval;
};
结构
{
浮动fval;
国际竞争力;
std::矢量数据;
};
std::vec;
int main()
{
向量调整(9);
对于(int i=0;i
resize(9)应该分配9个类型为_Struct的元素。事实上,它是有效的。但是_Struct类型的每个元素都没有初始化,尤其是数据元素,它是另一个std::vector。我希望它被初始化为空的std::vector。你必须手动完成吗?我认为resize()方法会调用每个_Struct元素的默认构造函数。 Thx

附言。 我首先想到的就是这里使用的结构的名称。这只是一个例子。我的Visual Studio告诉我,elem.data在调试视图中对应于
[0]()

附言。
忘记
[0]()

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

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

void resize(size_type sz, T c = T());
即,它有第二个参数(具有默认参数值)。然后,第二个参数被用作复制构造函数初始化新元素的“源”对象

换句话说,调用
resize
实际上相当于

vec.resize( 9, _Struct() );
这意味着,当您将“源”对象提供给
vector::resize
时,调用默认构造函数的是您,尽管您没有注意到这一点

但是_Struct类型的每个元素都没有初始化,尤其是 数据元素,它是另一个std::vector

嗯?“未初始化”?我不知道这意味着什么,因为在您的示例代码中,
resize
创建的每个新元素都是如上所述完全初始化的:它是从作为第二个参数隐式提供给
resize
\u Struct()
元素复制初始化的。每个
\u Struct::fval
\u Struct::ival
都是零,每个
\u Struct::data
都是空向量

(在原始的C++98中,由于TC1之前的C++98不支持值初始化,所以C++98中的
\u Struct::fval和\u Struct::ival将保持未初始化状态。但即使在原始的C++98中,
\u Struct::data
也将被初始化为空向量)

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

每个
\u Struct::data
向量都已初始化为空向量。是什么让你相信不是这样的


\uu
开头,后跟大写字母的p.S.名称由实现保留。不允许您使用它们。

以下划线开头,后跟大写字母的标识符是为实现保留的。我无法想象
len=elem.data.size()
如果没有初始化数据(它肯定应该是这样的),不会崩溃。
数据
中到底有什么?您希望其中有什么?向量中的元素默认基于自定义类的
调整大小
(对于整数,结果为0),您应该定义自己的默认构造函数。调用struct struct是一个坏主意,无论如何
数据
应该初始化为空向量。不是吗?如果不是,它的初始目标是什么?C++11是否添加了一个放置版本的
resize
?@Kerrek SB:我没有看到放置版本,但C++11将
vector::resize
拆分为两个函数:1)仅大小和2)大小和“源”对象。第一个版本现在在内部执行值初始化,这意味着我的答案对于C++11并不完全准确(即使最终结果相同)@KerrekSB我认为可以分两步完成:
reserve(myWantedSize)
然后执行for循环迭代
myWantedSize
次。在每次迭代调用时
.emplaceBack(myArg1、myArg2、myArg3等)