C ++存储最后X个传入项的最佳数据结构?

时间:2014-01-30 17:17:25

标签: c++ vector stack

我最初使用矢量存储“传入项目”,但即使有大量RAM也不实用。因此,我决定存储最后收到的X项。

最好的数据结构是什么?我在想一个std :: queue?这是我想到的伪代码:

if(queue.size() == max_size){
    queue.pop()
}

queue.push(new_item);

数据结构的用法是存储事件的历史记录,如果使用的话,将是回滚 - 因此迭代结构中的每个项目。

3 个答案:

答案 0 :(得分:8)

我使用ring buffer数据结构。 C ++ STL没有提供一个,但它是微不足道的。您只需要一个固定大小的数组和一个索引。

这是一个示例实现,类似于我使用的实现:

#include <iostream>
template <typename T, size_t TSize>
struct RingBuffer{
    enum{array_size = TSize+1};
    T array[array_size];
    size_t read;
    size_t write;
    RingBuffer():read(0),write(0){}

    T& pop(){
        T* p = NULL; //Return NULL reference if empty intentionally
        if(read!=write){
            p=array+read;
            read = (read+1)%array_size;
        }
        return *p;
    }
    bool is_empty(){return write==read;}
    bool is_full(){return (write+1)%array_size == read;}
    void push(T& v){
        array[write]=v;
        write = (write+1)%array_size;
        //Gracefully handle write overflow
        if(write==read)read=(read+1)%array_size;

    }
};
int main(int argc, const char * argv[])
{
    RingBuffer<int, 10> r;
    for(int i=0;i<15;++i) r.push(i);
    while (!r.is_empty()) std::cout<<r.pop()<<"\n";
    return 0;
}

答案 1 :(得分:0)

尝试deque,IMO这就是你要搜索的内容:

http://www.cplusplus.com/reference/deque/deque/

答案 2 :(得分:0)