在C++中构建向量

4

最近我看到了这段代码,但不太理解其中的含义。

auto c = vector<int> {};

向量构造函数返回什么?

那么这段代码:

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

第二个 c 是否在不同的内存位置上与最初的 c

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

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

以上内容与下面的内容有何不同:

vector<int> c {};

非常感谢您提前的帮助。


1
简短回答:那是C++11。 - jrd1
1
请使用正确的格式,否则尖括号中的文本将无法正确显示。 - codeling
关于 auto c = vector<int> {};vector<int> c{}; 之间的区别,请参阅Herb Sutter的Almost Always Auto风格。 - Angew is no longer proud of SO
你之前遇到过 {} 和初始化列表吗? - doctorlove
5个回答

5

"正如jrd1所说,这是C++11的一个特性。

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

因此,c是一个常规的vector<int>。"


3
“Guess” 这个词有点过于刻薄——如果类型无法完全推断,它就编不过去 :) - Johann Gerell
没问题,我会加上双引号的。 :) - elnigno
我想这就是误解的核心,其余的问题会随之而来。但是,其他答案更加完整,提问者已经接受了其中一个答案。 - elnigno

3
构造函数返回一个空的vector,编译器从构造函数调用中推断出变量c的类型,这意味着c将获得vector类型。auto基本上只是为您节省了输入变量类型两次的时间 - 它已经在构造函数调用中给出了,您现在不必在变量名前面再次输入它,可以使用auto代替。
不,它是同一个向量;但是来自另一个临时的vector(它保存1、2、3、4和5的值)的值通过operator=分配给c。这意味着c本身的地址(&c)不会改变。然而,它包含的数据(例如c.data()的结果)可能会改变。
并没有调用c的析构函数,只调用了临时变量的析构函数。

澄清内存位置的位:&c 不会改变,但 c.data() 可能会改变。 - ComicSansMS

2
“第一个c”指的是变量c(一个int向量)被定义的地方。
auto c = vector<int> {};

'第二个c'只是对变量c的值进行重新赋值。它不是一个新的变量,因此c的内存地址不会改变,也不会调用c的析构函数。

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

实际发生的是,向量 {1,2,3,4,5} 创建了一个类型为 vector 的临时对象,并使用值 1、2、3、4、5 初始化了它。然后将这个临时对象传递给 c 的复制构造函数(或在 C++11 中)移动构造函数,以使 c 用临时对象的值替换其当前的值(如果有的话)。c 的析构函数直到它超出范围(例如函数退出或定义它的控制块 {} 退出)才会被调用。

1
第一行和最后一行在功能上是等价的。
对于这个任务:
c = vector<int> {1,2,3,4,5 };

c不会被销毁,也不会在新的内存操作中被定位。 发生的是将创建一个未命名的第二个向量,其中包含5个值,并使用vector::operator=将该向量的内容分配给c。这将以C++11中的移动操作方式进行。之后,临时向量将被销毁并调用其析构函数,但不会调用c的析构函数。


1
C++11包括auto关键字,它可以为您执行类型推断。它有助于大大简化代码。例如:
auto itr = vec.iterator(); // instead of vector<int>::iterator itr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接