应用背景
在自动驾驶控制算法调试过程中,会碰见一些故障或者紧急状况,需要记录故障发生前一个时间窗口的数据信息最后输出用于问题排查,这样的话只记录关键数据,数据量小。这个时间窗口必须实时更新,超过时间窗口,自动舍弃老的数据。实现先入先出。 那么用队列queue来动态保存一个固定长度时间窗口的数据比较适合,由特定故障标志位触发将故障前的时间窗口的数据全部输出到log日志文件。
queue的好处不需事先指定size,另外相比vector容器,queue是先进先出可以很方便的舍弃窗口最早的数据,而vector是先进后出。
1.包含的头文件
要使用queue需包含如下头文件
#include <queue>
2.定义及初始化
std::queue<double> q1;
另外也可以用另一个队列对象来初始化
std::queue<double> q2(q1);
3.queue类型的成员函数
back()返回最后一个元素 empty()如果队列空则返回真 front()返回第一个元素 pop()删除第一个元素 push()在末尾加入一个元素 size()返回队列中元素的个数
4.用队列实现固定长度时间窗数据记录demo
#include <queue>
#include <iostream>
#include <vector>
std::queue<double> q1,q2;
#define QUEUE_LENGTH 20
int main()
{
for(int i=0;i<50;i++){
q1.push(i);
if(q1.size() > QUEUE_LENGTH){
q1.pop();
}
}
std::queue<double> q2(q1);
while(!q2.empty()){
std::cout<<q2.front()<<std::endl;
q2.pop();
}
std::cout<<"q1.size(): "<<q1.size()<<std::endl;
}
运行结果 上述demo程序实现了实现了队列始终记录最新的20帧数据,q1只记录了0~49中的30-49,也就是最后20帧数据。
|