向量的最大大小是多少?

时间:2020-03-09 16:38:01

标签: c++

此代码为什么不能处理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。

3 个答案:

答案 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次。