此代码为什么不能处理n=100000000
(8个零)?
此错误将终止代码:
在抛出'std :: bad_alloc'实例后调用terminate
因此,“ DONE”一词将不会打印出来。
using namespace std;
int main()
{
vector <long long> v1;
long long n; cin>>n;
for(long long i=0;i<n;i++){
v1.push_back(i+1);
}
cout<<"DONE"<<endl;
}
尽管v1
的最大大小为536870911。
答案 0 :(得分:7)
向量的最大大小是多少?
取决于几个因素。以下是一些上限:
std::vector::size_type
的最大可表示值std::vector::max_size
给出的理论上限在64位环境中,地址空间不是问题。
请注意,元素类型的大小会影响适合给定内存范围的元素数量。
您所遇到的最严格的限制是可用内存。 536870911比4 GB少long long
。
答案 1 :(得分:3)
来自cppref max_size()文档:
此值通常反映容器大小的理论极限 ...
在运行时,容器的大小可能会被一个小于max_size()的值限制为可用的RAM量。
答案 2 :(得分:1)
std::vector
包含一个指向单个动态分配的连续数组的指针。当您在循环中调用push_back()
时,只要向量的size()
超过capacity()
,该数组就必须随着时间增长。随着数组变大,分配更大的 contiguous 数组将旧数组元素复制到其中变得更加困难。最终,该数组太大,以致于根本无法再分配新副本,因此抛出了std::bad_alloc
。
为避免在循环时所有这些重新分配,请在进入循环之前调用向量的reserve()
方法:
int main() {
vector <long long> v1;
long long n; cin>>n;
v1.reserve(n); // <-- ADD THIS!
for(long long i = 0; i < n; ++i){
v1.push_back(i+1);
}
cout<<"DONE"<<endl;
}
那样,该数组仅分配1次。