当我使用这个代码时:
int main()
{
unsigned int n;
cin >> n;
vector<int>number[n];
return 0;
}
编译器将"n"标记为错误:
"表达式必须具有一个常数值">
"变量"n"的值不能用作常数"n";
但当我使用vector<int> v1(n)
时,错误消失了,效果很好。
因此,我的问题是:
将向量定义为vector<int> v1(n)
和vector<int> v2[n]
有什么区别
向量是否使用动态分配?
提前感谢
type_name variable_name[array_size];
是默认初始化数组变量的语法。CCD_ 4是n个向量的阵列。如果大小不是编译时常数(例如示例中没有(,则程序格式不正确,您引用的错误就是明证。
type_name variable_name(args);
是用于直接初始化变量的语法。
向量使用动态分配吗?
与大多数标准容器(除std::array
外的所有容器(一样,向量元素是动态对象。它使用已经提供给它的分配器来获取存储
两个定义之间的差异
vector<int> v1(n)
定义了包含n
元素的单个向量。vector<int> v2[n]
定义了一个可变大小的矢量数组,每个矢量都不包含任何元素。这通常被称为VLA
(可变长度数组(,而不是C++的正式组成部分(但它是C99的部分(。一些像gcc这样的编译器也支持它用于c++,但你不应该指望它
std::vector
分配
std::vectors
将使用所提供的分配器(第二模板自变量std::vector<T,Allocator>
(来分配它们的元素。
默认情况下,这将是std::allocator<T>
,它将使用new
&delete
——也就是说,它将在空闲存储中分配(大部分实现为堆(。
不过,如果您想使用其他分配策略(以下是您需要为自定义分配器实现的策略(,则可以提供不同的分配器