首页 > 代码库 > 非常方便的circular_buffer

非常方便的circular_buffer

 

编程时候经常需要使用定长的容器(fixed size container),比如有时日志只需要保留一周或一个月,或者缓存一天上游发来的数据流。

实现一个简单的旋转容器只需要像下面这样就好:

std::vector<T> vec(size);vec[i % size] = newelem;

 

但是boost的circular_buffer提供了更好的封装,更多的功能,我们便不需要也不应该重复造轮子了(DRY):

#include <boost/circular_buffer.hpp>

    boost::circular_buffer<int> cb(3);    // Insert threee elements into the buffer.    cb.push_back(1);    std::cout << "1 inserted, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size() - 1] << endl;    cb.push_back(2);    std::cout << "2 inserted, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size()-1] << endl;    cb.push_back(3);    std::cout << "3 inserted, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size()-1] << endl;    int a = cb[0];  // a == 1    int b = cb[1];  // b == 2    int c = cb[2];  // c == 3    std::cout << "1st is" << a << endl;    std::cout << "2nd is" << b << endl;    // The buffer is full now, so pushing subsequent    // elements will overwrite the front-most elements.    cb.push_back(4);  // Overwrite 1 with 4.    std::cout << "4 inserted, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size()-1] << endl;    cb.push_back(5);  // Overwrite 2 with 5.    std::cout << "5 inserted, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size()-1] << endl;    // The buffer now contains 3, 4 and 5.    a = cb[0];  // a == 3    b = cb[1];  // b == 4    c = cb[2];  // c == 5    std::cout << "1st is" << a << endl;    cb.pop_back();  // 5 is removed.    cb.pop_front(); // 3 is removed.    std::cout << "head and tail removed, size:" << cb.size() << endl;    std::cout << "latest is " << cb[cb.size() - 1] << endl;    // Leaving only one element with value = http://www.mamicode.com/4.    int d = cb[0];  // d == 4

 

非常方便的circular_buffer