在向量和双端队列之间进行以下使用的最有效方法是什么?

时间:2019-03-10 09:10:10

标签: c++ vector sfml deque memory-efficient

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

我想在像双端队列的容器中添加元素:我希望能够以一种有效的方式来push_back和pop_front。事实是,该容器将用于存储SFML库中的sf::Vertex,因此要渲染它,我将必须执行以下操作:

window.draw(&container[0], container.size(), sf::LineStrip)

这不适用于双端队列,因为双端队列的元素不是连续存储的。因此,由于我对内存使用了解不多,因此我想到了两个选择:

1)使用双端队列,并在渲染时将元素复制到向量中:

std::deque<sf::Vertex> container; ... std::vector<sf::Vertex> buffer {container.front(), container.back()}; window.draw(&buffer[0], buffer.size(), sf::LineStrip};

2)直接使用向量存储元素,并调用vec.erase(vec.begin());将元素弹出到第一个位置

由于几乎每个帧都会调用pop_front,我想知道哪种方法在内存方面花费最少?

如果您有其他任何想法,我会接受:)

编辑:

所以这是我昨天晚上实施的:

https://github.com/grybouilli/SFML-sf-Vertex-FIFO-like-container src和hdr文件中的主要代码:)

1 个答案:

答案 0 :(得分:3)

滚动自己的容器:

  • 该类仅将向量包装为成员。另外,您也可以私下从中获得。
  • 此外,您还要跟踪第一个有效元素的索引。弹出前部元素只会增加该索引。请注意,这意味着实际调用dtor会被延迟,这假设它并不重要,因为内存不足或没有内存开销。
  • 通过简单的转发方法或using公开获取您需要的vector中的那些方法。
  • 在向后添加元素时,请检查向量的容量以及其前面未使用的元素的数量。使用它来决定何时刷新元素。

作为一种方法,首先找出您使用的向量容器的接口。从您提到的内容来看

  • size()
  • data()(拼写&vec[0]的更具表现力的方式)
  • push_back()
  • pop_front()

首先使用下面的矢量定义它们。然后,如果可行,请根据您的特定需求对其进行优化。