BOOST 环形队列circular_buffer


BOOST库的环形队列比较灵活,前插或后插,删除队首或删除队尾元素,都支持。

只贴代码:

#include 
#include 
#include 
#include 
using namespace std;

class C_usrdata{
public:
  int x;
  int y;
};



void DispCirBuff(boost::circular_buffer &oCircularBuffer){

    for(boost::circular_buffer::iterator it=oCircularBuffer.begin();  it!=oCircularBuffer.end();  it++){
        cout  << (*it).x << "  " << (*it).y << endl;
    }
    cout << endl;
}

int main(int argc, char*argv[])
{
    // 创建一个容量为3的循环缓冲区
    boost::circular_buffer cb(3);

    // 插入一些元素到循环缓冲区
    C_usrdata data1 = {1, 1.34};
    C_usrdata data2 = {2, 2.34};
    cb.push_back(data1);
    cb.push_back(data2);

    // 断言
    cout << cb[0].y << endl;

    assert(!cb.full());
    assert(cb.size() == 2);
    assert(cb.capacity() == 3);

    cout << " running  ok" << endl;

    // 再插入其它元素
    C_usrdata data3 = {3, 3.34};
    cb.push_back(data3);


    cout << "队列已经满时,继续插入元素 -- 实验" << endl;
    C_usrdata data4 = {4, 4.34};
    cb.push_back(data4);
    // 当队列已经满时,继续插入元素,最前面的元素将会被挤出去。
    // 预测:此时队列中的数据从前往后,应该是:  data2 data3  data4
    DispCirBuff(cb);


    cout << "向队列头插入一个元素。ps:这是形成向后推的效果,如果之前队列已经满了,那么最后一个元素将被移出。" << endl;
    C_usrdata data5 = {5, 5.55};
    cb.push_front(data5);
    DispCirBuff(cb);
    // 预测:此时队列中的数据从前往后,应该是: data5 data2 data3
  

    cout << "向队列尾插入一个元素,ps:这是形成向前推的效果, 如果之前队列已经满了,那么第一个元素将被移出。" << endl;
    C_usrdata data6 = {6, 6.66};
    cb.push_back(data6);
    DispCirBuff(cb);
    // 预测:此时队列中的数据从前往后,应该是: data2 data3 data6


    cout << "移除缓冲区中的最后一位元素" << endl;
    cb.pop_back();
    DispCirBuff(cb);
    cout << cb.size() << endl << endl;
    // 预测:此时队列中的数据从前往后,应该是: data2 data3 


    cout << "移除缓冲区中的第一位元素" << endl << endl;
    cb.pop_front();
    DispCirBuff(cb);
    cout << cb.size() << endl << endl;
    // 预测:此时队列中的数据从前往后,应该是:  data2 

    return 0;
}

makefile:

.PHONY: DOIT

DOIT:
    mips-linux-gnu-g++ -I.  my_boost_test.cpp -L./lib  -lboost_thread -lboost_system -o boost_app  -lrt -lpthread

实测, 实验现象 , 全部预测正确。