0

我正在尝试在 stl 集中插入超过 650 万个元素(整数)。这是代码:

set<int> s;
cout << s.max_size() << endl;
for(int i = 0; i < T.MULT * T.MAXP; i++) {
    s.insert(a[i]);
}

T.MULT10T.MAXP666013

a是一个数组 - 静态分配 - ( int a[T.MULT * T.MAXP];) 包含不同的元素。

在大约 460 万个元素s.insert()引发bad_alloc异常之后。Windows 7 上可用的资源监视器说我还有 3 GB 可用内存。我究竟做错了什么?为什么 STL set 不能分配内存?

编辑:这是完整的代码:http: //ideone.com/rdrEnt

Edit2:显然插入的元素可能并不明显,但这应该不是问题。

Edit3:这是代码的简化版本:http: //ideone.com/dTp0fZ

4

3 回答 3

3

问题实际上在于您为数组 A 静态分配了超过 650 万个元素,这破坏了您的程序堆栈空间。如果您在堆上分配数组,它实际上可以工作。我根据您的描述做了一些代码更改,效果很好。

int *A = new int[T.MULT * T.MAXP];
for (int i= 0; i <  T.MULT * T.MAXP; ++i)
{
    A[i] = i; //for simplicity purpose, your array may have different elem. values
}

set<int> s;
for (int i = 0; i <  T.MULT * T.MAXP; ++i )
{
    s.insert(A[i]);
}

cout << s.size();

set<int>::iterator iter;
int count = 0;
for (iter = s.begin(); iter != s.end(); ++ iter)
{
    cout << *iter << " ";
    count ++;
    if (count == 100)
    {
        cout <<endl;
        count = 0;
    }
}

delete [] A;

return 0;

它适用于矢量和集合。它可以在屏幕上打印所有这 660 万个元素。

正如其他帖子所示,如果您有兴趣,您可能还想尝试 STXXL。

于 2013-03-18T13:43:11.860 回答
1

您可能想看看STXXL

于 2013-03-18T13:24:10.613 回答
1

虽然我无法直接回答您的问题,但我认为将您的数据存储在 std::vector 中,对其进行排序,然后使用 std::binary_search 测试该项目的存在会更有效。与 std::vector 相比,std::set 中的存储相对昂贵。那是因为在存储每个元素时会有一些开销。

例如,您可以这样做。这对静态数组进行排序。

std::sort(a,a+(T.MULT*T.MAXP));
bool existence=std::binary_search(a,a+(T.MULT*T.MAXP),3);

快速简单。

于 2013-03-18T13:21:42.890 回答