Кой STL C++ контейнер да използвам за списък с фиксиран размер?

Имам консумиращо приложение, което трябва да съхрани максимум 100 обекта в списък, за да подаде обратно извикване за обработка, тъй като ще бъде излишно да пазя стари данни, ако потребителят не навакса. Когато пристигнат нови данни, те могат просто да презапишат най-стария елемент.

Мислех да използвам кръгъл буферен контейнер и предположих, че ще бъде deque, но открих, че не използва кръгов списък, както и че няма опция за задаване на фиксиран максимален размер.

Има метод max_size в dequeue, но в документацията се казва „Това е максималният потенциален размер, който контейнерът може да достигне поради ограничения на внедряването на системата или библиотеката.“

Има ли друг контейнер, който мога да използвам?

PS: Използвам Visual C++ 2010 express


person paseena    schedule 05.04.2011    source източник


Отговори (4)


Няма стандартен библиотечен контейнер, който да прави това, което искате директно. Все пак трябва да погледнете Кръговия буферен контейнер на Boost. Ако не можете да използвате Boost, можете поне да видите неговия източник и да го повторите.

person GManNickG    schedule 05.04.2011
comment
@Thomas: И аз изрично казах, че там няма нищо, и предложих алтернатива. Какво бихте предпочели, без никакъв отговор? - person GManNickG; 06.04.2011
comment
@Gman, без да се обиждаш. Просто смятам, че е неуместно да се говори за Boost, когато има доста прости решения, базирани на STL. Поради различни причини Boost не е опция за някои хора. - person ThomasMcLeod; 06.04.2011
comment
@Thomas: Съществуват може би прости решения, базирани на stdlib, и те могат да бъдат приложени чрез разглеждане на изходния код на Boost... както предложих. Ако искаш, мога да изиграя и картата на педанта. - person GManNickG; 06.04.2011
comment
@Thomas За всеки случай, когато Boost не е опция, решението не е религиозно да се придържате към нищо друго освен към STL, а по-скоро да подготвите аргументите си, да наострите езика си и да говорите с правилните хора. - person wilhelmtell; 06.04.2011
comment
@wilhelmtell: Не бих могъл да го кажа по-добре. - person Matthieu M.; 06.04.2011
comment
@Thomas: Всичко е наред, ако искате да гласувате против, направете го, вие решавате. :) (Ако наистина сте променили позицията си, уведомете ме, но не се чувствайте притиснати.) - person GManNickG; 07.04.2011
comment
@Wilhelm, не знам какво се опитваш да внушиш с този коментар. Това означава ли, че разработчиците във всички ситуации трябва да могат да използват Boost, ако имат остър език, добре подготвени аргументи и говорят с правилните хора? Ако случаят е такъв, не съм съгласен. Ако разработвате по договор, в който се казва само стандартни библиотеки, молите ли две групи адвокати да се включат по проблема? Ако сте в училище и професорът каже да използвате STL, смятате ли, че трябва да предадете заданието си с помощта на Boost? - person ThomasMcLeod; 07.04.2011
comment
@GMan, препрочетох причините за отрицателното гласуване на meta и причината ми не изглежда валидна, според някои от публикациите там. - person ThomasMcLeod; 08.04.2011

Има boost::circular_buffer. Тогава има

std::vector<T> vec(size);
vec[i % size] = newelem;
person wilhelmtell    schedule 05.04.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;
    };

Все пак нещо подобно.

person Matt Phillips    schedule 05.04.2011

Обикновено преобръщам собствените си кръгови буфери със свързани списъци (предполагам, че ще бъде stl контейнерът "списък"). Това работи добре, освен ако не се нуждаете от много произволен достъп до елементи. Можете да напишете клас, съдържащ свързан списък и сами да поддържате размера (добавете елемент отзад, ако размер > праг {премахване на елемент отпред} и т.н.). Можете също така да правите кръгови буфери с нормални масиви/вектори, като поддържате и обвивате индекси на главата и опашката, но може да ви е по-добре с този за усилване, споменат от GMan.

person bobasaurus    schedule 05.04.2011
comment
Защо да използвате свързан списък върху непрекъснат масив? Недостатъците на свързаните списъци за това са натоварването на разпределителя, натоварването на паметта и фрагментацията (кеш пропуски). Предимството е, че вероятно е малко по-лесно да се пише. - person Drew Noakes; 15.12.2014