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

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


    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值