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 = 4.

    int d = cb[0];  // d == 4

 

你可能感兴趣的:(buffer)