c++ - 对于以下用途,vector 和 deque 之间最有效的是什么?

标签 c++ vector sfml deque memory-efficient

如果问题不是很详细,请提前道歉,但这是一个非常具体的案例。

我想在一个非常像双端队列的容器中添加元素:我希望能够以高效的方式 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/

相关文章:

c++ - 没有合适的默认承包商可用的编译器错误

c++ - 在 Arduino ide 中读取多个文本文件

c++ - 字符串数组中的第一个字符串被跳过

c++ - 如何在编译时找出 std::bitset 的大小

r - 如何将概率插入矩阵?

vector - 用于向量空间搜索的 NoSQL DB

C++ SFML qt creator Unresolved external

c++ - 在现代 opengl 中移动形状/对象

c++ - 给定起点和终点以及距离,计算沿线的点

c++ - 使用 CodeBlocks 将 GLEW 链接到 SFML 项目时出现问题