排序大数组对

Sorting large array of pairs

本文关键字:数组 排序      更新时间:2023-10-16

我需要一个算法,根据每对的第一个元素对数组进行排序。下面的代码对于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;
}

看起来像是堆栈溢出。

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

std::vector< std::pair<double, int> >AB_large(v_size);
// ...
std::sort(AB_large.begin(), AB_large.end());

你的数组是一个局部变量,所以它是在堆栈上创建的。通常对堆栈大小有限制。在Linux上,通常可以通过ulimit命令查看和修改它。(在Windows上,c++可执行文件的堆栈限制是在编译时确定的,它可以通过编译器选项或pragmas来改变。)

你的pair的一个实例的大小是8+4=12字节。默认的堆栈限制通常是8兆字节。由于编译器的对齐设置,可能将12个字节填充为16个字节。所以,219 * 16 = 223字节,也就是相同的8 mebibytes。