Sorting large array of pairs

问题描述:

我需要一种算法,根据每对中的第一个元素对一组数组进行排序。以下代码适用于v_size <〜2^19,但是,在接近2^19的大小时,由于分段错误而崩溃。是什么原因?大小约为524000并不是很大。 (我正在使用gcc(Debian 4.7.2-5)4.7.2)Sorting large array of pairs

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <time.h> 

using namespace std; 


int main(int argc, char ** argv) 
{ 
    srand(time(NULL)); 

    int v_size=524000; 
    std::pair<double, int> AB_large[v_size]; 

    for(int i = 0; i<v_size; ++i) 
    { 
     AB_large[i].first = static_cast <double> (rand())/static_cast <double> (RAND_MAX); 
     AB_large[i].second = i; 
    } 

    std::sort(AB_large, AB_large+v_size); 
    return 0; 
} 
+1

与地址空间量相比,这并不是很大。但相比* stack *空间的数量... – Jon

+0

你知道它至少会有6288000个字节吗?超过5千兆字节的内存。这可能比您为堆栈空间更多。 –

+0

你将如何处理碰撞? –

它看起来像堆栈溢出。

尽量不要使用自动变量对于这样大的物体:

std::vector< std::pair<double, int> >AB_large(v_size); 

// ... 

std::sort(AB_large.begin(), AB_large.end()); 

你的阵列是一个局部变量,因此它是在栈上创建。堆栈大小通常有限制。在Linux上,通常可以通过ulimit命令查看和修改它。 (在Windows上,C++可执行文件的堆栈限制在编译时确定,并且可以通过编译器选项或编译指示进行更改。)

对的一个实例是8 + 4 = 12字节大小。默认的堆栈限制通常是8兆字节。由于编译器的设置为alignment,可能有12个字节被填充到16个字节。所以,2个字节是相同的8兆字节。