性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

嵌入式客棧
認(rèn)證:普通會(huì)員
作者動(dòng)態(tài)
去除warning的一個(gè)騷操作~
2024-09-04 15:31
開(kāi)發(fā)板給電腦自動(dòng)分配IP?手把手教部署零配置網(wǎng)絡(luò)實(shí)現(xiàn)電腦與開(kāi)發(fā)板直連
2024-09-02 13:08
加個(gè)默認(rèn)參數(shù)還是重載呢?
2024-09-01 10:45
驅(qū)動(dòng)調(diào)試神器printk你掌握了嗎?
2024-08-27 09:45
準(zhǔn)度、精度傻傻分不清?
2024-08-25 10:10

QT容器很香之QList<T>實(shí)戰(zhàn)舉例

今天來(lái)聊一下QList,QList 是一種QT容器,如果能熟練使用它,會(huì)非常香。

什么是QList<T>

QList<T> 是QT中通用容器類(lèi),它將對(duì)象存儲(chǔ)在一個(gè)表中,該表提供基于索引的快速訪問(wèn)和基于索引的插入和刪除。熟悉C++標(biāo)準(zhǔn)庫(kù)的話,就類(lèi)似于std:list<T> ,為什么這里描述是跟了一個(gè)<T>呢?因?yàn)槭侨萜黝?lèi),所謂容器,就把它想象成一個(gè)能裝東西的框,但是這與現(xiàn)實(shí)生活中的框還是有區(qū)別的,現(xiàn)實(shí)中的框可以隨便往里面裝東西,先裝幾個(gè)土豆,再放兩顆白菜,再放一本書(shū)....,隨便裝,只要放的下。

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

  • 對(duì)于特定的容器,需要指明其可裝進(jìn)去的對(duì)象類(lèi)型
  • 對(duì)于特定的容器,只能裝指定的類(lèi)型

那么,為什么又說(shuō)是泛型呢?就是說(shuō)不同的QList對(duì)象,根據(jù)所指定的T的類(lèi)型,可以裝各自不同類(lèi)型的對(duì)象,比如:

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

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

前面說(shuō)QList是基于索引插入和刪除的容器類(lèi),何以見(jiàn)得呢?來(lái)看看QT官方文檔例子:

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

這意味著這三個(gè)元素是這樣放的:

實(shí)戰(zhàn)例子

假設(shè)有這么一個(gè)需求,利用一個(gè)socket接收一個(gè)設(shè)備的計(jì)算數(shù)據(jù),每一個(gè)計(jì)算數(shù)據(jù)是這樣的:

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

在類(lèi)中加入QList<T>,這里T是t_measure:

QList<t_measure> m_measure;

一個(gè)報(bào)文里面有多個(gè)測(cè)量結(jié)果,QT寫(xiě)的應(yīng)用程序,需要一邊收一邊顯示或者存儲(chǔ),接收可能是一個(gè)線程,或者sokect消息回調(diào)函數(shù),比如是UDP接收的:

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

接收函數(shù):

#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++;
      }
    }
  }
}

假設(shè)定義一個(gè)頭部標(biāo)識(shí)為0x7FAAAAF7CCCCCCCC, 頭部正確,然后按照長(zhǎng)度不斷將接收到的數(shù)據(jù)追加到表的尾部。

在另一個(gè)地方可以從頭部不斷取出數(shù)據(jù)進(jìn)行后續(xù)處理,比如進(jìn)行進(jìn)一步計(jì)算,顯示或存儲(chǔ),比如:

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

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

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

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

如果不使用QList<T>,自己實(shí)現(xiàn)一個(gè)FIFO則需要考慮很多細(xì)節(jié)問(wèn)題,所以使用C++,或者QT要盡量擺脫C語(yǔ)言的編程習(xí)慣,盡量使用已有的輪子,這會(huì)大大提高生產(chǎn)效率。

總結(jié)一下

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

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 1
收藏 3
關(guān)注 80
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧