我试图找出保持向量中元素数量恒定的最快方法(或者可能有一些现成的结构自动完成)。
在我的应用程序中,我向向量添加了多个元素,我需要快速完成。由于矢量在某些时候自调整大小,因此显着降低了整体应用程序的速度。我在想的是做这样的事情:
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()
是否仍然需要在某个时候调整大小。
还有其他解决办法吗?
答案 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