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
实测, 实验现象 , 全部预测正确。