排序大对子

时间:2014-05-06 13:25:40

标签: c++ algorithm sorting stl std-pair

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

#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;
}

2 个答案:

答案 0 :(得分:3)

看起来像堆栈溢出。

尽量不要为这么大的对象使用自动变量:

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

// ...

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

答案 1 :(得分:3)

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

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