繁体   English   中英

用C ++构造向量

[英]Constructing Vectors in C++

我最近遇到了这个代码,但不太明白发生了什么。

auto c = vector<int> {};

返回的向量构造函数是什么?

然后这段代码:

c = vector<int> {1,2,3,4,5 };

第二个c是否位于与初始c不同的内存位置?

c重新初始化时,是否会调用析构函数?

我搜索了互联网,但找不到上述代码的任何示例。

以上是如何不同的

vector<int> c {};

在此先感谢您的帮助。

“正如jrd1所说,它是一个C ++ 11特性。

关键字auto基本上意味着让编译器“猜测”变量的类型。

所以c是常规vector<int>

返回的向量构造函数是什么?

vector<int> ; 并且编译器从该构造函数调用中推导出变量c的类型,这意味着c将获得类型vector<int> auto基本上只是保存你两次输入变量类型 - 无论如何已经在构造函数调用中给出了,你现在不必再次在变量名前面键入它,你可以使用auto代替。

第二个c是否位于与初始c不同的内存位置?

不,它是相同的载体; 但来自另一个临时vector<int> (包含值1,2,3,4和5)的值通过operator=分配给c 这意味着, c本身( &c )的地址不会改变。 但是,它包含的数据(例如c.data()的结果)可能也可能会改变。

当c重新初始化时,是否会调用析构函数?

不是c的析构函数。 只有一个来自临时。

'first c'是定义变量c(int的向量)的地方。

auto c = vector<int> {};

'second c'只是重新赋值c。 它不是一个新变量,因此c的内存地址不会改变,并且不会调用c的析构函数。

c = vector<int> {1,2,3,4,5 };

实际发生的是vector {1,2,3,4,5}创建了一个vector类型的临时对象,它从初始化列表中初始化,值为1,2,3,4,5。 然后将此临时对象传递给c的复制构造函数(或在C ++ 11中)移动构造函数,以便c用临时对象中的值替换其当前值(如果有)。

c的析构函数在超出范围之前不会被调用(例如,函数退出或定义它的控制块{}退出)。

第一行和最后一行在功能上是等效的。

对于作业:

c = vector<int> {1,2,3,4,5 };

c不会被破坏或者之后被定位在新的存储器操作中。 会发生的是,将使用5个值创建未命名的第二个向量,并使用vector::operator=将该vector::operator=的内容分配给c。 这将在C ++ 11中的移动操作方面发生。 之后临时矢量将被销毁并且它的析构函数被调用,但不是c的析构函数。

C ++ 11包含auto关键字,它为您执行Type Inference
它有助于简化代码。
例:

auto itr = vec.iterator(); // instead of vector<int>::iterator itr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM