如果问题不是很详细,请提前道歉,但这是一个非常具体的案例。
我想在一个非常像双端队列的容器中添加元素:我希望能够以高效的方式 push_back 和 pop_front。事情是,容器将用于存储 sf::Vertex
来自 SFML 库,因此要渲染它,我必须做类似的事情:
window.draw(&container[0], container.size(), sf::LineStrip)
这不适用于双端队列,因为双端队列的元素不是连续存储的。所以,由于我不太了解内存使用,我正在考虑两种选择:
1) 使用双端队列并在渲染它时,将元素复制到 vector 中:
std::deque<sf::Vertex> container;
...
std::vector<sf::Vertex> buffer {container.front(), container.back()};
window.draw(&buffer[0], buffer.size(), sf::LineStrip};
2) 直接用vector存储元素调用vec.erase(vec.begin());
在第一个位置弹出元素
由于几乎每一帧都会调用 pop_front,我想知道哪种方法在内存方面成本最低?
如果你有任何其他想法,我会采纳它们:)
编辑:
所以这是我昨天晚上实现的一些东西:
https://github.com/grybouilli/SFML-sf-Vertex-FIFO-like-container src 和 hdr 文件中的主要代码:)
最佳答案
滚动你自己的容器:
- 该类只是包装一个 vector 作为成员。或者,您可以私下从中派生。
- 此外,您还要跟踪第一个有效元素的索引。弹出前面的元素只会增加该索引。请注意,这意味着实际调用 dtor 是延迟的,这假设内存开销低或没有内存开销并不重要。
- 通过简单的转发方法或在私有(private)派生时
使用
公开您需要的那些来自vector的方法。 - 在向后面添加元素时,检查 vector 的容量和前面未使用的元素数。用它来决定何时刷新元素。
作为一种方法,首先找出您使用的 vector 容器的接口(interface)。从你提到的有
大小()
data()
(更具表现力的拼写方式&vec[0]
)push_back()
pop_front()
首先定义它们,使用下面的 vector 。然后,如果可行,请根据您的特定需求对其进行优化。
关于c++ - 对于以下用途,vector 和 deque 之间最有效的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55086120/