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

问题描述 投票:1回答:1

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

我想在一个像deque一样的容器中添加元素:我希望能够以有效的方式使用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文件中的主要代码:)

c++ vector sfml deque memory-efficient
1个回答
3
投票

滚动你自己的容器:

  • 该类只包含一个向量作为成员。或者,您可以私下从中衍生出来。
  • 此外,您还可以跟踪第一个有效元素的索引。弹出前面的元素只会增加该索引。请注意,这意味着实际调用dtor会被延迟,这假定它不是很重要或没有内存开销。
  • 您需要的矢量中的那些方法可以通过简单的转发方法或私有派生时的using公开。
  • 向后面添加元素时,请检查向量的容量以及前面未使用元素的数量。用它来决定何时刷新元素。

作为一种方法,首先要找出您使用的向量容器的哪些接口。从你提到的那里

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

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

© www.soinside.com 2019 - 2024. All rights reserved.