vector(size_type count,const T& value = T())
意思是…
int* array = new array[1000000];
可能比以下效率要高得多:
std::vector<int> v(1000000);
因为向量构造函数必须对整数数组进行零初始化.因此,当使用POD的向量时,没有真正的相当于malloc;你可以得到的最好的是相当于calloc.
C 11似乎已经改变了这个“价值初始化”的概念.在C 11中,std :: vector有一个新的构造函数,它采用单个size_type值,没有默认参数.这个“值初始化”矢量中的所有元素. C 11标准区分“初始化值”和“零初始化”.
我的理解是,“值初始化”等同于在T上调用默认构造函数.如果T是类似int的POD类型,那么默认构造函数只需创建一个未初始化的整数.因此,在C11中,如果T是POD,则显式vector :: vector(size_type count)与malloc完全相同.
不过,我对此的理解是基于C11标准草案,而不是最终标准.
问题:我的理解是否正确?如果T是POD,显式vector :: vector(size_type count)是否提供一个未初始化的数组(类似于malloc)?
解决方法
Question: Is my understanding correct here? Does
explicit vector::vector(size_type count)
provide an uninitialized array
(similar tomalloc
) ifT
is a POD?
不,在这里C 03和C 11之间有区别,但不是这样.不同之处在于,在C 03中,向量T(N)将默认构造T,然后使其N个副本填充向量.
而在C 11中,向量T(N)将默认地填充该向量N次.对于POD类型,效果是相同的.事实上,我希望对于几乎所有类型的效果是一样的.然而,对于像unique_ptr(仅限移动类型)的东西,差异至关重要. C 03语义将永远不会工作,因为您不能制作一个只移动类型的副本.
所以:
vector<unique_ptr<int>> v(10);
创建一个10个null unique_ptrs的矢量(它们不是彼此的副本).
在罕见的情况下,它有所作为,您需要C 03行为,可以轻松实现:
vector<T> v(10,T());