Какой контейнер STL C ++ использовать для списка фиксированного размера? - PullRequest
7 голосов
/ 06 апреля 2011

У меня есть приложение-потребитель, которому нужно хранить не более 100 объектов в списке для подачи в обратный вызов для обработки, так как будет избыточно хранить старые данные, если потребитель не догонит их. По мере поступления новых данных они могут просто перезаписать самый старый элемент.

Я думал об использовании кругового буферного контейнера и предположил, что это будет deque, но обнаружил, что он не использует круговой список, а также не имеет возможности установить фиксированный максимальный размер.

Существует метод max_size в очереди, но в документации сказано: «Это максимальный потенциальный размер, которого может достичь контейнер из-за ограничений реализации системы или библиотеки».

Есть ли другой контейнер, который я могу использовать?

PS: я использую Visual C ++ 2010 express

Ответы [ 4 ]

16 голосов
/ 06 апреля 2011

Нет стандартного контейнера библиотеки, который делает то, что вы хотите напрямую.Тем не менее, вы должны взглянуть на Контейнер кругового буфера Boost .Если вы не можете использовать Boost, вы можете, по крайней мере, просмотреть его источник и повторить его.

13 голосов
/ 06 апреля 2011

Там boost :: round_buffer . Тогда есть

std::vector<T> vec(size);
vec[i % size] = newelem;
4 голосов
/ 06 апреля 2011

Почему бы просто не использовать вектор с индексом, который увеличивает mod 100 каждый раз, когда добавляется новый объект?

    #define NUM_ELTS 100
    template < typename T >
    class CircularVector
    { 
    public:
       CircularVector() : idx(0)
       {
          vec = vector<T>(NUM_ELTS);
       }
       void push_back(T& elt)
       {
          vec[ idx++ % NUM_ELTS ] = elt;
       }
    private:
       int idx;
       vector<T> vec;
    };

Как-то так.

0 голосов
/ 06 апреля 2011

Я обычно скручиваю свои собственные циклические буферы со связанными списками (я думаю, это будет контейнер "list" stl). Это работает хорошо, если вам не нужно много случайного доступа к элементам. Вы можете написать класс, содержащий связанный список, и поддерживать размер самостоятельно (добавить элемент сзади, если размер> порог {удалить элемент спереди} и т. Д.). Вы также можете создавать кольцевые буферы с обычными массивами / векторами, поддерживая и упаковывая индексы головы и хвоста, но вам может быть лучше с усилением, упомянутым GMan.

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