为什么我不能在 STL 集中插入 600 万个元素?
Why can't I insert 6 million elements in STL set?
我试图在一个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.MULT
为10
;T.MAXP
为666013
a
是一个静态分配的数组(int a[T.MULT * T.MAXP];
),它包含不同的元素。
在大约460万个元素之后,s.insert()
抛出bad_alloc
异常。Windows 7上可用的资源监视器显示我还有3gb的可用内存。我做错了什么?为什么STL不能设置分配内存?
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);
快捷方便
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中,如何通过几种类型从元组中选择多个元素
- 删除列表中的第n个元素
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 在链链表中手动插入第五个元素
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 删除列表 c++ 中的最后 3 个元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 打印无序映射的第二个元素,即集合
- C++ queue.front();为什么不从第一个元素开始呢?
- 如何提高具有100万个元素和997个存储桶的哈希表的性能
- 创建一个包含300万个元素的双数组
- 为什么我不能在 STL 集中插入 600 万个元素?
- STL C++队列中的300万个元素