中国建设银行网站多少,wordpress换行,wordpress交易平台主题,怎么用手机做刷赞网站boost库中的 circular_buffer顾名思义是一个循环缓冲器#xff0c;其 capcity是固定的当容量满了以后#xff0c;插入一个元素时#xff0c;会在容器的开头或结尾处删除一个元素。
circular_buffer为了效率考虑#xff0c;使用了连续内存块保存元素
使用固定内存#x…boost库中的 circular_buffer顾名思义是一个循环缓冲器其 capcity是固定的当容量满了以后插入一个元素时会在容器的开头或结尾处删除一个元素。
circular_buffer为了效率考虑使用了连续内存块保存元素
使用固定内存没有隐式或者非期望的内存分配快速在circular_buffer头或者尾部插入删除元素并且是常量时间复杂度常量时间访问元素适合实时和对性能要求苛刻的应用
circular_buffer头部和尾部都可以写入内部使用了两个指针firstlast来操作写入。
在初始化时候firstlast都指向了固定申请内存的开始。假定申请固定的buffer元素为N个。 buffer [0] [1] [2] …[] [n-2] [n-1] | first last
当不断使用push_back填充buffer如下显示的是插入了n-1个元素last始终指向下一个要插入的位置
buffer [0] [1] [2] …[] [n-2] [n-1] | | first last
当插入了n个元素队列满时last指针回转到头部又与first指针相等了如果没有使用pop_front读取过元素。
buffer [0] [1] [2] …[] [n-2] [n-1] | first last
这时候再插入元素first指向的元素buffer[0]就要被覆写了。
buffer [0] [1] [2] …[] [n-2] [n-1] | first last
如上first指针也改变了buffer[0]已经是最新的元素buffer[1]才是最老的元素。
push_front与之类似只不过是移动first指针插入数据。
#includeiostream
using namespace std;
#includeboost/circular_buffer.hpp
using namespace boost;int main()
{// 定义并初始化一个循环缓冲区circular_bufferint cb(3);//容量为3cout cb.capacity() endl; // 3cout cb.size() endl; // 0cb.push_back(1);//从尾部插入cb.push_back(2);//cb.push_back(3);//容量已满cout cb.capacity() endl; // 3cout cb.size() endl; // 3//cb.push_front(1);//从头插入//cb.push_front(2);////cb.push_front(3);//容量已满for (int i 0; i cb.size(); i) cout cb[i] ;cout endl;//容量已满尾部插入踢出头部元素cb.push_back(4);for (int i 0; i cb.size(); i) cout cb[i] ;cout endl;//容量已满头部插入踢出尾部元素cb.push_front(5);for (int i 0; i cb.size(); i) cout cb[i] ;cout endl;cb.pop_back();//删除尾部的元素for (int i 0; i cb.size(); i) cout cb[i] ;cout endl;cb.pop_front();//删除头部的元素for (int i 0; i cb.size(); i) cout cb[i] ;cout endl;return 0;
}可能适用的场景
可存储最新接收到的samples当更新的samples到来覆写最老的元素可用作底层容器实现固定大小buffer可作为一种cache保存一定数量的最新插入的元素高效的固定大小先进先出队列高效的后进先去队列当队列满时移除最老的元素也就是第一个插入的元素