在向量中保持恒定数量的元素

时间:2016-05-11 14:56:57

标签: c++ vector

我试图找出保持向量中元素数量恒定的最快方法(或者可能有一些现成的结构自动完成)。

在我的应用程序中,我向向量添加了多个元素,我需要快速完成。由于矢量在某些时候自调整大小,因此显着降低了整体应用程序的速度。我在想的是做这样的事情:

if(my_vector.size() < 300)
    my_vector.push_back(new_element);
else
{
    my_vector.pop_front();
    my_vector.push_back(new_element);
}

但是经过前几次测试后我才意识到它可能不是最好的解决方案,因为我不确定pop_front()以及后来push_back()是否仍然需要在某个时候调整大小。

还有其他解决办法吗?

3 个答案:

答案 0 :(得分:2)

使用std::queue。它的底层容器是std::deque,但是像堆栈一样,队列的接口专门用于FIFO操作(push_back,pop_front),这正是你在你的情况下所做的。这就是为什么deque在这种情况下更好的原因:

  

双端队列的存储会自动扩展并缩减为   需要。扩展deque比扩展a便宜   std :: vector因为它不涉及复制现有的   元素到新的记忆位置。

     

deques的常见操作的复杂性(效率)如下   如下:

     
      
  • 随机访问 - 常数O(1)
  •   
  • 在结尾或开头插入或移除元素 - 常数O(1)
  •   

答案 1 :(得分:1)

要使用push_back和pop_front以及最小内存重排来实现固定大小的容器,请使用适当大小的std::array。要跟踪事物,你需要一个用于推送元素的前索引和一个用于弹出事物的后退索引。要推送,请将元素存储在front_index给定的位置,然后递增front_index并将剩余部分取为容器大小的模数。要弹出,请在back_index给出的位置读取元素,并按照与front_index相同的方式调整该索引。有了这些,问题中的代码就可以满足您的需求。

答案 2 :(得分:0)

您只需reserve容量即可达到合理数量。矢量不会自动shrink。所以它只会增长,并且可能会在某个时刻停止。

您可能也对调整大小政策感兴趣。例如,Facebook进行了大量研究并创建了自己的向量实现 - folly::fbvector,其性能优于std::vector