c++ - это - node js vs electron




Какой массив/список я должен использовать? (3)

Вы можете попробовать циклический буфер Boost.

Я ищу тип списка, который реализует следующую функцию (псевдокод):

 list.init(5, 2, 6, 9);
 list.add(1) // 2, 6, 9, 1
 list.add(4) // 6, 9, 1, 4
 list.add(8) // 9, 1, 4, 8

Добавьте новый элемент в список фиксированного размера и вставьте самый старый. Извините, я не знаю название этой концепции, поэтому я спрашиваю вас, какое имя может быть. ;)

Моя реализация в C ++ будет на самом деле так:

std::deque<double> values(4);

void add(double value)
{
    values.pop_front();
    values.push_back(value);
}

Есть ли лучшие реализации, чем у меня, может быть, за все время фиксированного размера?


То, что вы хотите, называется круговой буфер. В STL такого контейнера нет, но у Boost есть реализация.

Если вы не хотите использовать огромную зависимость от Boost, вы можете легко реализовать обертку над std::array (если число элементов маленькое) или над std::vector .

Оболочка должна помнить размер основного контейнера и его текущую позицию, например:

template <class T>
class circular_buffer {
    std::size_t current_pos, cursor;
    std::vector<T> storage;

    circular_buffer(std::size_t size):current_pos(0), cursor(0){
        storage.resize(size);
    }

    void push_back(T elem){
        storage[current_pos++] = T;
        if (current_pos == storage.size()){
            current_pos = 0;
        }
    }

    T get_element(){
        if (cursor == storage.size()){
            cursor = 0;
        }
        return storage[cursor++];
    }

};

Обратите внимание, что пример упрощен и не реализует такие вещи, как второй аргумент шаблона, если используется std::array , или что делать, если ваш курсор и позиция вставки догоняют друг друга.


Boost's round_buffer - это то, что вы хотите.

Пример использования:

   boost::circular_buffer<int> buffer(3);
   buffer.push_back(1);
   buffer.push_back(2);
   buffer.push_back(3);
   // now buffer is 1, 2, 3
   buffer.push_back(4);
   // now buffer is 2, 3, 4

Живой пример





types