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

标签 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.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

最佳答案

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

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。

关于c++ - 为什么我不能在 STL 集中插入 600 万个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15477672/

相关文章:

c++ - EDSDK 消息循环在 Windows 8.1 下不工作

c++ - 如何通过指针将一个实例替换为另一个实例?

java - java Protobuf 对象集与 Class 对象的行为不同

python reduce 找到集合的并集

c++ - friend 在 C++ 中遇到麻烦

c# - Visual Studio 2012 C# - 导入 DLL

c++ - STL 容器中的持久引用

c++ - 用于通过快速迭代按值从任何位置删除的容器

algorithm - 找到两个具有相等总和的子集时出错

c++ - 开关盒中的多种选项