文件读取,双端队列实现滑动窗

来源:互联网 发布:java ssh协议 编辑:程序博客网 时间:2024/06/07 17:24

本文所讲的是:使用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;    }


    


原创粉丝点击