乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      QMap與QHash

       torony 2016-02-20

       關(guān)聯(lián)容器可以保存任意多個(gè)具有相同類型的項(xiàng),且它們由一個(gè)鍵索引。Qt提供兩個(gè)主要的關(guān)聯(lián)容器類:QMap<K, T>QHash<K, T>

           QMap<K, T>是一個(gè)以升序鍵順序存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。這種排列使它可以提供良好的查找插入性能及鍵序的迭代。在內(nèi)部,QMap<K, T>是作為一個(gè)跳越列表(skip-list)來(lái)實(shí)現(xiàn)執(zhí)行的。

           在映射中插入項(xiàng)的一種簡(jiǎn)單方式是調(diào)用insert():

      QMap<QString, int> map;

      map.insert("eins", 1);

      map.insert("sieben", 7);

      map.insert("dreiundzwanzig", 23);

      另外,也可以像下面一樣,給一個(gè)指定的鍵賦值:

      map["eins"] = 1;

      map["sieben"] = 7;

      map["dreiundzwanzig"] = 23;

          []操作符即可以用于插入也可以用于檢索。如果在非常量映射中使用[]為一個(gè)不存在的鍵檢索值,則會(huì)用給定的鍵和空值創(chuàng)建一個(gè)新的項(xiàng)。為了避免意外的創(chuàng)建空值,可以使用value()函數(shù)代替[]操作符來(lái)獲得項(xiàng)。

      int val = map.value("dreiundzwanzig")

          如果鍵不存在,則利用值類型的默認(rèn)構(gòu)造函數(shù),將返回一個(gè)默認(rèn)值,同時(shí)不會(huì)創(chuàng)建新的項(xiàng)。對(duì)于基本類型和指針類型,將返回0值。我們可以指定另一默認(rèn)值作為value()的第二個(gè)參數(shù),例如:

      int seconds = map.value("delay", 30);

      這相當(dāng)于:

      int seconds = 30;

      if (map.contains("delay");

          seconds = map.value("delay");

          QMap<K, T>的K和T數(shù)據(jù)類型可以是與int、double、指針類型、有默認(rèn)構(gòu)造函數(shù)的類、復(fù)制構(gòu)造函數(shù)和賦值操作符相似的基本數(shù)據(jù)類型。此外,K類型必須提供operator<(),因?yàn)镼Map<K, T>要使用這個(gè)操作符以提升鍵序順序存儲(chǔ)項(xiàng)。

          QMap<K, T>的K和T有一對(duì)方便的函數(shù)keys()和values(),它們?cè)谔幚硇?shù)據(jù)集時(shí)顯的特別有用。它們分別返回映射鍵的QList和映射值的QList。

      映射通常都是單一值的:如果賦予一個(gè)現(xiàn)有的鍵一個(gè)新值,則原有的舊值將被該新值取代,以確保兩個(gè)項(xiàng)不會(huì)共有同一個(gè)鍵。通過(guò)使用insertMulti()函數(shù)或者QMlltiMap<K, T>方便的子類,可以讓多個(gè)鍵值對(duì)有相同的鍵。QMap<K, T>重載了value(const K &), 返回一個(gè)給定鍵多有值的QList列表。例如:

      QMultiMap<int, QString> multiMap;

      multiMap.insert(1, "one");

      multiMap.insert(1, "eins");

      multiMap.insert(1, "uno");

      QList<QString> vals = multiMap.values(1);

          QHash<K, T>是一個(gè)在哈希表中存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。它的接口幾乎與QMap<K, T>相同,但是與QMap<K, T>相比,它對(duì)K的模板類型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。

          除了對(duì)存儲(chǔ)在容器類中的所有值類型的一般要求,QHash<K, T>中K的值類型還需要提供一個(gè)operator==(),并需要一個(gè)能夠?yàn)殒I返回哈希值的全局qHash()函數(shù)的支持。Qt已經(jīng)為qHash()函數(shù)提供了對(duì)整型、指針型、QChar、QString以及QByteArray。

          QHash<K, T>為它內(nèi)部的哈希表自動(dòng)分配最初的存儲(chǔ)區(qū)域,并在有項(xiàng)被插入或者刪除時(shí)重新劃分所分配的存儲(chǔ)區(qū)域的大小。也可以通過(guò)調(diào)用reserve()或者squeeze()來(lái)指定或者壓縮希望存儲(chǔ)到哈希表中的項(xiàng)的數(shù)目,以進(jìn)行性能調(diào)整。通常的做法是利用我們預(yù)期的最大的項(xiàng)的數(shù)目來(lái)?xiàng)l用reserve(),然后插入數(shù)據(jù),最后如果有多出的項(xiàng),則調(diào)用squeeze()以使內(nèi)存的使用減到最小。

          雖然哈希表通常都是單一值的,但是使用insertMulti()函數(shù)或者M(jìn)ultiHash<K, T>方便的子類,也可以將多個(gè)值賦給同一個(gè)鍵。

          除了QHash<K, T>之外,Qt還提供了一個(gè)用來(lái)高速緩存與鍵相關(guān)聯(lián)的對(duì)象的QCache<K, T>類以及僅僅存儲(chǔ)鍵的QSet<K>容器。在內(nèi)部,它們都依賴于QHash<K, T>,且都像QHash<K, T>一樣對(duì)K的類型有相同的要求。

          最簡(jiǎn)便的遍歷存儲(chǔ)在關(guān)聯(lián)容器中多有鍵值對(duì)的方式是使用Java風(fēng)格的迭代器。因?yàn)榈鞅仨毮芡瑫r(shí)訪問(wèn)鍵和值,針對(duì)關(guān)聯(lián)容器的Java風(fēng)格的迭代器與連續(xù)容器的在運(yùn)作方式有些差異。只要區(qū)別在于next()和previous()函數(shù)返回一個(gè)代表鍵值對(duì)的對(duì)象,而不是一個(gè)簡(jiǎn)單的值。我們可以使用key()和value()分別從這個(gè)對(duì)象中獲得鍵和值。例如:

      QMap<QString, int> map;

      ...

      int sum = 0;

      QMapIterator<QString, int> i(map);

      while (i.hasNext())

          sum += i.next().value();

          如果需要同時(shí)存取鍵和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函數(shù),它們都是針對(duì)最后被跳過(guò)的項(xiàng)進(jìn)行操作的:

      QMapIterator<QString, int> i(map);

      while(i.hasNext()){

          i.next();

          if (i.value() > largestValue){

              largestKey = i.key();

              largestValue = i.value();

          }

      }   

       

      ===========================================================================================

      原文鏈接:http:///2010/11/17/qt-qhash-and-qmap-difference.html

      QMap提供了一個(gè)從類項(xiàng)為key的鍵到類項(xiàng)為T的直的映射,通常所存儲(chǔ)的數(shù)據(jù)類型是一個(gè)鍵對(duì)應(yīng)一個(gè)直,并且按照Key的次序存儲(chǔ)數(shù)據(jù),
      這個(gè)類也支持一鍵多值的情況,用類QMultiMap

      QHash具有和QMap幾乎完全一樣的APi,此類維護(hù)這一張哈希表,表的大小和數(shù)據(jù)項(xiàng)是自適應(yīng)的,QHash是以任意的順序住址他的數(shù)據(jù),,當(dāng)然了他也是可以支持一鍵多值的,QMultiHash

      兩種之間的區(qū)別是:
      QHash查找速度上顯著于QMap
      QHash以任意的方式進(jìn)行存儲(chǔ),而QMap則是以key順序進(jìn)行存儲(chǔ)
      Qhash 的鍵類型必須提供operator==()和一個(gè)全局的qHash(key)函數(shù)。而QMap的鍵類型key必須提供operator<()函數(shù)

      他們同樣也是有兩種風(fēng)格的迭代容器。用來(lái)進(jìn)行遍歷的。。
      STL 風(fēng)格的

      QMap<key,T>  QMap<key,T>::const_iterator QMap<key,T>::iterator//同樣中間那個(gè)也是只讀的,最后那個(gè)是讀寫的。

      下面以一個(gè)例子來(lái)進(jìn)行說(shuō)明:

      #include <QDebug>

      int main(int argc, char *argv[])
      {
          QMap<QString, QString> map;
          map.insert("beijing""111");
          map.insert("shanghai""021");
          map.insert("tianjin""022");
          map.insert("chongqing""023");
          map.insert("jinan""0531");
          map.insert("wuhan""027");   

      QMap<QString, QString>::const_iterator i;
          for( i=map.constBegin(); i!=map.constEnd(); ++i)
              qDebug() << i.key() <<"        " << i.value();   
             
          QMap<QString, QString>::iterator mi;
          mi = map.find("beijing");
          if(mi != map.end())
              mi.value() = "010";
          QMap<QString, QString>::const_iterator modi;
          qDebug() << "";
          for( modi=map.constBegin(); modi!=map.constEnd(); ++modi)
              qDebug() << modi.key() <<"        " << modi.value();   
          return 0;
      }

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多