Тип контейнера FIFO - Какой контейнер STL наиболее подходит и почему?

Недавно мне было поручено реализовать буфер, который будет использоваться в качестве временного хранилища классом журналирования. Сам класс ведения журнала является одноэлементным, и используется шаблон слушателя наблюдателя. Вы можете ожидать, что с помощью этого класса будут регистрироваться тысячи сообщений.

Проблема заключается в следующем:

У нас есть опция ведения журнала трассировки, которая используется для отладки. Когда эта опция включена, количество сообщений в секунду увеличивается экспоненциально. В коде выпуска ведение журнала трассировки отключено, однако буфер, который может хранить фиксированное количество сообщений, например. 10000 записывается в журнал ЕСЛИ возникает ошибка, чтобы разработчики могли определить корень проблемы.

Если буфер заполнен, самое старое сообщение удаляется, чтобы освободить место для самого нового сообщения.

void Log::storeToBuffer(const LogType_E & type_in, const LogDomain_E & domain_in,const int & id_in, const char * msg_in)
{
    if(this->myEnableTraceBuffer)
    {
        if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() < this->myRingBufferMaxSize)
        {
            static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
        }
        else
        {
            //buffer full so remove oldest element and add new
            if(static_cast<std::list<Message> * >(this->myRingBuffer)->size() > 0) static_cast<std::list<Message> * >(this->myRingBuffer)->pop_front();
            static_cast<std::list<Message> * >(this->myRingBuffer)->push_back(Message(type_in, domain_in, id_in, msg_in));
        }
    }
}

Я реализовал это с помощью std :: list, очень просто используя push_back / pop_front, чтобы использовать постоянное время выполнения удаления / вставки. ( не просите о преобразовании в пустоту, а не о моем решении ).

Но поскольку размер буфера фиксирован и вряд ли будет изменен в течение жизненного цикла объекта, может быть, вектор с явным манипулированием индексом более подходит? Например, может быть два индекса, start / current, начиная с позиции 0. Когда вектор заполнен, и мы добавляем что-то, start перемещается в позицию 1, а current - в позицию 0, таким образом, при печати результата у нас есть правильный порядок.

Может быть, для такого рода вещей больше подходит другой контейнер STL?

Спасибо за терпение, чтобы прочитать эту длинную стену текста. Я здесь, чтобы ответить на любые вопросы.

5
задан FailedDev 4 November 2011 в 20:30
поделиться