gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:10:47 25 4
gpt4 key购买 nike

我正在尝试以下代码:

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 元素的默认构造函数。谢谢

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

附言。忘记 [0]()

最佳答案

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

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

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

即它有第二个参数(具有默认参数值)。然后,第二个参数用作“源”对象以通过复制构造函数 初始化新元素。

换句话说,您对 resize 的调用实际上等同于

vec.resize( 9, _Struct() );

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

But every element of type _Struct is not initialized, especially the data element, which is another std::vector.

嗯? “未初始化”?我不知道那是什么意思,考虑到在您的示例代码中, resize 创建的每个新元素都已按上述方式完美初始化:它是从 _Struct( ) 元素作为第二个参数隐式提供给 resize。每个 _Struct::fval_Struct::ival 都是零,每个 _Struct::data 都是一个空 vector 。

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

I would like it to be initialized to the empty std::vector.

每个 _Struct::data vector 都已经初始化为一个空 vector 。是什么让您相信它不是?

附言以 _ 开头后跟大写字母的名称由实现保留。您不得使用它们。

关于c++ - vector.resize() 方法在调整大小时是否调用默认元素构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com