Что наиболее эффективно между вектором и deque для следующего использования? - PullRequest
1 голос
/ 10 марта 2019

Заранее извините, если вопрос не очень подробный, но это довольно специфический случай.

Я хочу добавить элементы в контейнер, который очень похож на deque: я хочу иметь возможность push_backи pop_front эффективным способом.Дело в том, что контейнер будет использоваться для хранения sf::Vertex из библиотеки SFML, и поэтому для его рендеринга мне нужно сделать что-то вроде:

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

И это выигралоне работает с deque, поскольку элементы deque не хранятся непрерывно.Итак, поскольку я не очень разбираюсь в использовании памяти, я думаю о двух вариантах:

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 Ответ

3 голосов
/ 10 марта 2019

Сверните свой собственный контейнер:

  • Класс просто переносит вектор как член.В качестве альтернативы, вы можете получить из него конфиденциально.
  • Кроме того, вы отслеживаете индекс первого допустимого элемента.Поппинг элемента фронта только увеличивает этот индекс.Обратите внимание, что это означает, что фактический вызов dtor задерживается, что предполагает, что для него не важен низкий уровень или отсутствие перегрузки памяти.
  • Те методы из вектора, которые вам нужны, предоставляются либо простыми методами пересылки, либо using, когдачастное получение.
  • При добавлении элементов в конец, проверьте емкость вектора и количество неиспользуемых элементов в его передней части.Используйте это, чтобы решить, когда очищать элементы.

В качестве подхода сначала выясните, какие интерфейсы векторного контейнера вы используете.Из того, что вы упомянули, есть

  • size()
  • data() (более выразительный способ заклинания &vec[0])
  • push_back()
  • pop_front()

Сначала определите их, используя вектор снизу.Затем, если это сработает, оптимизируйте его под свои конкретные потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...