为什么我不能在STL集中插入600万个元素?

时间:2013-03-18 13:10:35

标签: c++ stl set max-size

我试图在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.MULT10; T.MAXP666013

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

大约460万个元素s.insert()抛出bad_alloc个异常。 Windows 7上提供的资源监视器说我剩下3 GB可用内存。 我究竟做错了什么?为什么STL不能分配内存?

修改:以下是完整代码:http://ideone.com/rdrEnt

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

Edit3:以下是代码的简化版:http://ideone.com/dTp0fZ

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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);

快速而简单。

答案 2 :(得分:1)

您可能需要查看STXXL