码迷,mamicode.com
首页 > 其他好文 > 详细

非常方便的circular_buffer

时间:2015-01-29 14:20:20      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

 

编程时候经常需要使用定长的容器(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 = 4.
    int d = cb[0];  // d == 4

 

非常方便的circular_buffer

标签:

原文地址:http://www.cnblogs.com/scottgu/p/4259447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!