本文所讲的是:使用C++中文件流读取文件数据保存到数组,再用双端队列实现滑动窗口:
文件读取操作:需加入文件流头文件:
#include <fstream>
#include <cstring>
#include <sstream>
ifstream ifile("/home/桌面/aaa/"+to_string(t1)+".txt");//路径+文件名
int a[8][2];
char line[256];
int intarr[5];
int linenum=1,k=0;
//读txt数值保存到数组中
while(ifile.good())
{
ifile.getline(line,68);
// puts(line);
istringstream iss(line);
iss>>intarr[0]>>intarr[1]>>intarr[2];
// cout<<"第"<<linenum<<"行"<<endl;
if(linenum>=62&&linenum<=69) //60-67将所有数据保存到数组a中。
{
for(int i=0;i<2;++i)
{
// cout<<intarr[i]<<endl;
a[k][i]=intarr[i];
}
k++;
}
linenum++;
}
ifile.close();
分段输入数据,当大于时间窗的数目时,pop(弹出)一个再push一个,以保证队列中始终是有时间窗长度个数据。
双端队列deque,需加入头文件。弹出为:pop,压入为push. back为尾部,front为首部。.size()为求队列元素个数的方法。
#include <deque>
if(i>=WIN) mode=1; //滑动窗口大小
switch(mode){
case 0:
dequetest.push_front(aph);
//cout<<m;
if(aph>YAWN){ //哈欠的张口度阈值YAWN(4处)aph值的计算为使用前面存储在a数组中的数据计算得到,此处省略。
state.push_front(1);
}
if(aph<YAWN) {
state.push_front(0);
// t++;
}
break;
case 1:
//cout<<m;
state.pop_back();
dequetest.pop_back();
dequetest.push_front(aph);
if(aph>YAWN){
state.push_front(1);
}
if(aph<YAWN) {
state.push_front(0);
}
break;
default:
break;
}
这样就实现了双端队列实时存储数据,也就实现了时间窗滑动的功能。该队列与普通数组具有相同的索引方式,dequetest[10]表示当前队列第11号元素。本文代码实现的是从头部push,也就是每次新读到的数据会保存在 dequetest[0]中,而每次删除数据都是将dequetest的最后一个元素弹出堆栈。
如将尾部作为新增数据的存储位置,首部作为弹出的位置,可以写为:
if(i>=WIN) mode=1; //滑动窗口大小
switch(mode){
case 0:
dequetest.push_back(aph);
//cout<<m;
if(aph>YAWN){ //aph值的计算为使用前面存储在a数组中的数据计算得到,此处省略。
state.push_back(1);
}
if(aph<YAWN) {
state.push_back(0);
// t++;
}
break;
case 1:
//cout<<m;
state.pop_front();
dequetest.pop_front();
dequetest.push_back(aph);
if(aph>YAWN){
state.push_back(1);
}
if(aph<YAWN) {
state.push_back(0);
}
break;
default:
break;
}