有效地处理大量独特元素(std :: set vs其他容器)

时间:2014-10-29 06:05:37

标签: c++ c++11 stl stdset

我有std :: set有大量唯一对象作为其元素。

在程序的主线程中:

  
      
  1. 我从集合
  2. 中获取了一些对象   
  3. 将要处理的数据分配给每个
  4.   
  5. 从集合
  6. 中删除这些对象   
  7. 最后将对象传递给线程池中的线程进行处理
  8.   
  9. 一旦这些线程完成处理对象,他们就会将它们添加回集合中。 (这样在下一次迭代中,主线程可以再次出现   将下一批数据分配给这些对象进行处理)
  10.   

这种安排很完美。但是如果我在向对象添加对象时遇到错误(例如,std::set.insert()抛出bad_alloc),那么这一切都会继续折腾。 如果我忽略该错误并继续,则该对象无法返回到处理集中,并且它永远不会超出程序流程,导致内存泄漏。

为了解决这个问题,我试图不从集合中删除对象。相反,有一个成员标志,表明该对象正在被处理'。但在这种情况下,问题是,主要线程遭遇正在处理'迭代遍历set的所有元素时,一次又一次地反对对象。它严重阻碍了性能(集合中的对象数量非常大)。

这里有哪些更好的选择?

  1. 可以使用std::list代替std::set吗?添加返回元素时列表不会出现bad_alloc问题,因为它只需要在向列表添加元素时指定指针。但是我们怎样才能使列表元素独一无二?如果我们实现它,它会像std :: set一样有效吗?

  2. 有没有办法元素移动到集合的开头或结尾?而不是将元素移除并添加到std :: set中?因此,未经处理的对象和已处理的对象将一起累积到集合的开始和结束。

  3. 还有其他解决方案吗?

0 个答案:

没有答案