99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

QT容器很香之QList<T>實戰舉例

今天來聊一下QList,QList 是一種QT容器,如果能熟練使用它,會非常香。

什么是QList<T>

QList<T> 是QT中通用容器類,它將對象存儲在一個表中,該表提供基于索引的快速訪問和基于索引的插入和刪除。熟悉C++標準庫的話,就類似于std:list<T> ,為什么這里描述是跟了一個<T>呢?因為是容器類,所謂容器,就把它想象成一個能裝東西的框,但是這與現實生活中的框還是有區別的,現實中的框可以隨便往里面裝東西,先裝幾個土豆,再放兩顆白菜,再放一本書....,隨便裝,只要放的下。

但是,這個容器類跟的這個<T>,是指泛型,從字面意思上看,好像也是什么對象都可以往里面放,但是這么幾層需要理解:

  • 對于特定的容器,需要指明其可裝進去的對象類型
  • 對于特定的容器,只能裝指定的類型

那么,為什么又說是泛型呢?就是說不同的QList對象,根據所指定的T的類型,可以裝各自不同類型的對象,比如:

QList<float> m_list1;
QList<int>  m_list2;

m_list1可以存float型的對象,而m_list2則可以裝int型對象。這是怎么做到的呢,是C++編譯器在編譯期根據T本身類型編譯綁定的。

前面說QList是基于索引插入和刪除的容器類,何以見得呢?來看看QT官方文檔例子:

QList<QString> list = { "one", "two", "three" };

這意味著這三個元素是這樣放的:

實戰例子

假設有這么一個需求,利用一個socket接收一個設備的計算數據,每一個計算數據是這樣的:

typedef struct _t_measure {
  qint64 addr;
  qint64 Real;
  qint64 Imag;
  qint64 rms;
}t_measure;

在類中加入QList<T>,這里T是t_measure:

QList<t_measure> m_measure;

一個報文里面有多個測量結果,QT寫的應用程序,需要一邊收一邊顯示或者存儲,接收可能是一個線程,或者sokect消息回調函數,比如是UDP接收的:

connect(m_MeasureUdpSocket, SIGNAL(readyRead()),
        this, SLOT(readMeasurement()));

接收函數:

#define MAX_BUF_SIZE        (300)
#define MAX_BUF_SIZE_BYTES  (MAX_BUF_SIZE*8)
void Measurement::readMeasurement()
{
  typedef union _u_buf {
    char  buf[MAX_BUF_SIZE_BYTES];
    qint64 dpts[MAX_BUF_SIZE];
  }u_buf;

  u_buf buffer;
  t_measure *pRaw=nullptr;
  int len = 0;
  while (m_MeasureUdpSocket->hasPendingDatagrams()) {
    len = m_MeasureUdpSocket->pendingDatagramSize();
    if(len>MAX_BUF_SIZE_BYTES)
       len = MAX_BUF_SIZE_BYTES;
      
    m_MeasureUdpSocket->readDatagram(buffer.buf, len);
    if(buffer.dpts[0]==0x7FAAAAF7CCCCCCCC) {
      pRaw = (t_measure *)&buffer.dpts[2];
      for(int i=0;i<buffer.dpts[1];i++) {
         m_measure.append(*pRaw);
         pRaw++;
      }
    }
  }
}

假設定義一個頭部標識為0x7FAAAAF7CCCCCCCC, 頭部正確,然后按照長度不斷將接收到的數據追加到表的尾部。

在另一個地方可以從頭部不斷取出數據進行后續處理,比如進行進一步計算,顯示或存儲,比如:

 if(m_measure.isEmpty()) {
    return;
  }

  int pts = m_measure.size();
  t_measure temp;
  for(int i=0;i<pts;i++) {
    temp = m_measure.takeFirst();
    
    //做后續處理
    ......
  }

上述例子,用一個示意圖描述,大概就是下面這樣:

接收端不斷在尾部追加,而處理端則在頭部取出,就是一個FIFO操作。

如果不使用QList<T>,自己實現一個FIFO則需要考慮很多細節問題,所以使用C++,或者QT要盡量擺脫C語言的編程習慣,盡量使用已有的輪子,這會大大提高生產效率。

總結一下

使用C++,熟悉掌握容器這些泛型編程方法,不用自己去管理這些底層實現,會大大提高效率。我覺得蠻香,你覺得呢?

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 3
關注 79
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 国产v亚洲v天堂无码 | 国产精品免费久久久久久久久久中文 | 精品中文视频 | 高清无码免费视频专区 | a一级黄色录像 | 久久久久久久久亚洲精品 | 精品国产一区二区三区麻豆小说 | 久久精品福利 | 亚洲最新免费视频 | 麻豆成人免费视频 | 国内视频精品 | 国产精品无码一区二区三区不卡 | 亚洲精品免费av | 日韩中文字幕免费观看 | 在线免费看一级片 | 韩国无码无遮挡在线观看 | 国产精品不卡一区 | www.好色 | 日日夜夜精品网站 | 国产精品全新69影院在线看 | wwwwxxxxx日本| 夜夜澡人摸人人添人人看 | 91视频九色欧美 | 日本黄在线观看 | 日韩黄色免费观看 | 91精品国产高清一区二区三密臀 | 乱人伦人成品精国产在线 | 麻豆福利视频 | 透逼视频 | 亚洲VS成人无码人在线观看堂 | 午夜剧场大片亚洲欧洲一区 | 综合国产视频 | 三年片在线观看免费大全 | 永久黄软件免费观看 | 久久精品国产成人精品 | 久久艹精品 | 日韩毛片免费视频一级特黄 | 特大巨黑吊xxx | 日韩精品无码免费专区午夜 | 精品99免费视频 | 九九天堂网|