vector的C ++大小

时间:2015-03-30 15:34:03

标签: c++ linux vector size

#include <iostream>
#include <vector>
#include "mixmax.h"//<-here, there is random number generator called  mixmax
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
const unsigned long long int n=10000000;
vector < float > f(n);
vector < float > distance_1(n);
vector < float > distance_2(n);
rng_state_t s;
rng_state_t *x=&s;
seed_spbox(x,12345);//<-here we just devlare our random number generator
for(int i=0;i<n;i++)
f[i]=int(n*get_next_float(x));//,<-here we just get random numbers,like    rand()
sort(f.begin(),f.end());
for(int i=0;i<n;i++)
{
   distance_1[i]=f[i]-i;
   distance_2[i]=(i+1)-f[i];
}
float        discrep=max(*max_element(distance_1.begin(),distance_1.end()),*max_element(dis    tance_2.begin(),distance_2.end()));
cout<<"discrep= "<<discrep<<endl;
cout<<"sqrt(n)*discrep= "<<discrep/sqrt(n)<<endl;
}

当我打印f.max_size()(代码中上面的向量拒绝)给了我这个巨大的数字4611686018427387903,但当我拿n = 10000000000时,它不起作用,它给出了这个错误:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped). 

(我在Windows下的Visual Studio中尝试过它。)

问题是什么?如果向量不适用于大尺寸,有人可以告诉我如何使用具有非常大尺寸的矢量或阵列

3 个答案:

答案 0 :(得分:2)

引用cplusplus.com

  

的std ::矢量:: MAX_SIZE

     

返回最大元素数   矢量可以容纳。

     

这是容器可以达到的最大潜在尺寸   已知的系统或库实现限制,但容器   绝不保证能够达到那个大小:它仍然可以   在达到该大小之前,无法在任何时刻分配存储。

因此,vector并不保证它可以保留max_size个元素,它只是一个实现限制。

另外,chris提及:

  

10 GB * sizeof(float) * 3是要分配的大量内存。我   猜测你的操作系统不会让你全部分配好   原因。

OP问道,

  

如果矢量不适合大尺寸,任何人都可以告诉我如何使用   矢量或阵列有很大的尺寸???

是的,你可以。试试RoomySTXXL

答案 1 :(得分:1)

max_size()size()不同,与capacity()

不同

当前容量为n=10000000,因此最后一个元素为distance_1[9999999]

答案 2 :(得分:0)

  

问题是什么???

据推测,分配失败是因为您的计算机没有120GB的可用内存。 max_size告诉你vector的实现在理论上可以管理多少元素,给定足够的内存;它不知道运行程序时实际可用的内存量。

  

如果这个向量不能用于大尺寸任何人都可以告诉我如何使用大而大的矢量或数组?

增加计算机上的RAM或交换空间量(并确保操作系统是64位,但是从max_size()的值我猜它是)。或者使用STXXL之类的东西来使用文件来备份庞大的数据结构。