Какую структуру данных использовать - PullRequest
3 голосов
/ 05 июня 2011

Я ищу правильную структуру данных для этого сценария.У меня есть повышение, доступное для использования.

Код изначально был на C #, и я использовал очередь там, но я не верю, что это был правильный выбор, и нет эквивалента C ++ для очереди C #, так какнасколько я могу судить.Я смотрю на следующие свойства с точки зрения их частоты / важности:

  • Требуется быстрая итерация
  • Необходимо иметь возможность быстро продвигать структуру (т. Е. Когда я тянуэлемент сверху, следующий элемент должен быть заголовком структуры)
  • Время от времени удаляется, а затем полностью заполняется
  • Время от времени копируется
  • Не требуетсяотсортированные по мере добавления элементов будут в правильном порядке

Количество элементов будет известно во время создания и будет составлять от 50 до 200 элементов.Структура никогда не будет содержать больше этого, но иногда может содержать меньше

Я рассматривал возможность использования std :: list, но из-за необходимости очищать, а затем периодически заполнять, это не кажется хорошим вариантом.Когда я создаю список с фиксированным размером, а затем очищаю его, он теряет префиксный размер, не так ли?Есть ли какой-нибудь способ всегда сохранять размер списка, чтобы ему не приходилось освобождать / выделять память?

Я знаю, что boost имеет структуру данных очереди, но она не повторяется, и я не уверенесли бы у меня была такая же проблема, как у меня с std::list

Было бы полезно несколько советов о том, как вписать std::list в мою проблему или более подходящую структуру данных.

Ответы [ 3 ]

10 голосов
/ 05 июня 2011

std::deque, кажется, отвечает всем вашим требованиям.

Если производительность является реальной проблемой для вас, вы должны прочитать ответ GMan до Предварительно выделить место для очереди C ++ STL .

2 голосов
/ 05 июня 2011

Похоже, кольцевой буфер должен работать? Есть один в повышении: boost::circular_buffer.

0 голосов
/ 05 июня 2011

Кольцевой буфер (реализованный в виде статического массива Foo buffer[200] и двух счетчиков), как предлагает eevar, будет лучшимНет необходимости в STL / Boost.

...