FIFO类型的容器 - 哪种STL容器最合适,为什么?

Fai*_*Dev 5 c++ containers 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用std :: list实现了这一点,非常简单地使用push_back/pop_front来利用常量删除/插入执行时间.(不要求空洞铸造,而不是我的决定).

但由于缓冲区大小是固定的,并且在对象的生命周期内不太可能改变,因此具有显式索引操作的向量可能更合适吗?例如,可以有两个indeces,开始/当前在位置0处开始.当向量已满并且我们添加一些内容时,开始移动到位置1并且当前到位置0,因此在打印结果时我们有正确的顺序.

也许另一个STL容器更适合这种东西?

感谢您耐心阅读这长篇文章.我在这里回答任何问题.

Xeo*_*Xeo 2

听说过吗std::deque?:)
它允许双方进行摊销恒定时间随机访问和恒定时间推送/弹出操作。因此,它可以很容易地用作 FIFO 队列。

也就是说,由于它可以如此轻松地使用,因此有一个容器适配器std::queue,尽管它不提供随机访问和迭代器接口。

  • 我认为,它(`std::queue`)不仅不提供随机访问,而且也不提供输出逻辑可能需要的迭代。当然,你可以连续弹出,但这会破坏容器。 (2认同)