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

Why can't I insert 6 million elements in STL set?

本文关键字:万个 元素 不能 STL 插入 集中 为什么      更新时间:2023-10-16

我试图在一个stl集合中插入超过650万个元素(int)。下面是代码:

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上可用的资源监视器显示我还有3gb的可用内存。我做错了什么?为什么STL不能设置分配内存?

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

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

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

问题实际上在于您静态地为数组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;

对于vector和set都能很好地工作。它可以将这660万个元素全部打印到屏幕上。

正如其他帖子所指出的,如果您有兴趣,您可能也想尝试STXXL。

您可能想看看STXXL。

虽然我不能直接回答您的问题,但我认为将数据存储在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);

快捷方便