Qtコンテナクラスとその遍歴(JavaスタイルとSTLスタイルの反復器)

11714 ワード

1、Qtは、汎用的なテンプレートベースのコンテナクラスのセットを提供する.QtのコンテナクラスはC++の標準準テンプレートライブラリのコンテナクラスと比較して、より軽量で、より安全で、より使いやすい.また,Qtのコンテナクラスは速度,メモリ消費,インラインコードなどの面で最適化されている.
2.Qtコンテナクラスに格納されているデータは、付与可能なデータ型である必要があります.すなわち、このデータ型は、パラメータを必要としないコンストラクタ、レプリケーションコンストラクタ、および付与操作演算子を提供する必要があります.
3.これらのデータ型には、基本データ型(int、doubleなど)やQtなど、一般的に使用されるデータ型の大部分(QString、Qdate、QTimeなど)が含まれています.ただし、QtのQObjectおよびそのサブクラス(QWidget、QDidialogなど)は、コンテナに格納できません.たとえば、次のようになります.
QList list; //  ,  QObject                    。

ただし、QObjectおよびそのサブクラスのポインタを格納することができる.例:
QList<QToolBar*> list;

4**、Qtのコンテナクラスは、ネスト可能な**です.たとえば、次のようになります.
QHashdouble> >; //    QString,    QList

注:最後の2つの">"の間にスペースを残す必要があります.そうしないと、コンパイラは2つの">"を1つの">>"と解釈し、コンパイルできません.
5、Qtの容器類には2つの遍歴方法がある:(1)Java風の反復器;(2)STL風の反復器、効率はやや優れている.
6、QListクラス:QListは、QListに格納されたリスト項目の内容を指すポインタ配列を維持する.したがって、QListは、下付き文字に基づく高速アクセスを提供する.例:
QList m_list;
QString m_str("this is a test string");
m_list << m_str;
qDebug() << m_list[0] << "how are you";

7、QLinedListクラス:下付き文字は使用できません.反復器を使用してデータ項目にアクセスするしかありません.
8、QVectorクラス:下付き文字を使用してデータ項目にアクセスするか、反復器を使用してデータ項目にアクセスすることができます.
9、Javaスタイル反復器コンテナ遍歴:Qtは各コンテナクラスに対して2種類のJavaスタイル反復器データ型、すなわち、読み取り専用アクセスと読み書きアクセスを提供する.
たとえば、Listクラスの場合、読み取り専用反復器クラス:QListIterator;読み書き反復器クラス:QMutableListIterator.
Javaスタイル反復器の反復点は、リスト項目を直接指すのではなく、リスト項目の真ん中にあります.したがって、その反復点は、最初のリスト項目の前にあるか、2つのリスト項目の間にあるか、最後のリスト項目の後にあるかのいずれかです.
(1)QList読み取り専用遍歴:
    QList<int> m_list;
    m_list << 1 << 2 << 3 << 4 << 5;

    QListIterator<int> m_iterator(m_list);
    while (m_iterator.hasNext()) 
    {
        qDebug() << m_iterator.next(); //        ,             。
    }

(2)QList読み書き遍歴:
    int i = 0;
    QList m_list;
    QMutableListIterator m_mutableIterator(m_list);

    for (i = 0; i < 10; ++i)
    {
        m_mutableIterator.insert(i);
    }

    m_mutableIterator.toFront();

    while (m_mutableIterator.hasNext())
    {
        qDebug() << m_mutableIterator.next();  //  
    }

    for (m_mutableIterator.toBack(); m_mutableIterator.hasPrevious();)
    {
        if (m_mutableIterator.previous() % 2 == 0)
        {
            m_mutableIterator.remove();  //      ,        ;     ,  10
        }else
        {
            m_mutableIterator.setValue(m_mutableIterator.peekNext() * 10);
        }
    }

    for (m_mutableIterator.toFront(); m_mutableIterator.hasNext();)
    {
        qDebug() << m_mutableIterator.next(); //  
    }

10**、STLスタイルの反復器コンテナ**:Qtは、各コンテナクラスについて、STLスタイルの反復器データ型、すなわち、読み取り専用アクセスと読み書きアクセスの2種類を提供します.(読み取り専用反復器の動作速度が速い)
STLスタイルの反復器のAPIは、ポインタ操作に基づいて構築されています.たとえば、「++」操作演算子は反復器を次のアイテム(item)に移動し、「*」オペレータは反復器が指すアイテムを返します.
Javaスタイルの反復器とは異なり、STLスタイルの反復点はリスト項目を直接指します.
例:QListの読み取り専用反復器クラス:QList::const_iterator;読み書き反復器クラス:QList::iterator
    QList<int> m_list;
    for (int j = 0; j < 10; ++j)
    {
        m_list.insert(m_list.end(), j); /* m_list.end()              ,m_list.end()                   (             )。*/
    }

    QList<int>::iterator m_listIterator;
    for (m_listIterator = m_list.begin(); m_listIterator != m_list.end(); ++m_listIterator)
    {
        qDebug() << *m_listIterator;
        *m_listIterator *= 10;
    }

    QList<int>::ConstIterator m_constIterator;
    for (m_constIterator = m_list.constBegin(); m_constIterator != m_list.constEnd(); ++m_constIterator)
    {
        qDebug() << *m_constIterator;
    }

11、QMapクラスとQHashクラス
(1)違い:
  • QHashクラスの検索速度が速い.
  • QHashは任意の順序でデータ項目を格納する.
  • QHashのキータイプKeyはoperator==()とグローバルqHash(Key)関数を提供する必要がありますが、QMapのキータイプKeyはoperatorを提供する必要があります.

  • (2)QMapクラス:ワンタッチ多値をサポートするため、QMapはQMapを提供する
        QMap map_str;
    
        map_str.insert("beijing", "111");
        map_str.insert("shanghai", "111");
        map_str.insert("lvliang", "0358");
        map_str.insert("taiyuan", "0351");
    
        QMapIterator java_Iter_Map(map_str);  //  
        java_Iter_Map.toFront();
        while (java_Iter_Map.hasNext())
        {
            qDebug() << java_Iter_Map.key() << java_Iter_Map.next().value();   //   :      next()
        }
    
        QMutableMapIterator java_Iter_MutMap(map_str); //  
        java_Iter_MutMap.toFront();
        while (java_Iter_MutMap.hasNext())
        {
            if (java_Iter_MutMap.findNext("111"))   /*java                。*/
            {
                java_Iter_MutMap.setValue("010");
            }
        }
    
        qDebug() << "
    "
    ; java_Iter_MutMap.toFront(); while (java_Iter_MutMap.hasNext()) { qDebug() << java_Iter_MutMap.key() << java_Iter_MutMap.next().value(); }
  • STLスタイル:
  •     QMultiMap STL_map;  //     map
    
        STL_map.insert("zhangyuxin", "32");
        STL_map.insert("zhengyuan", "33");
        STL_map.insert("maxiang", "31");
        STL_map.insert("maxiang", "399");
    
        QMap::const_iterator STL_const_ite; //   
        for (STL_const_ite = STL_map.constBegin(); STL_const_ite != STL_map.constEnd(); ++STL_const_ite)
        {
            qDebug() << STL_const_ite.key() << STL_const_ite.value();
        }
    
        QMap::iterator STL_ite;
        for(STL_ite = STL_map.begin(); STL_ite != STL_map.end(); ++STL_ite)
        {
            if (STL_ite.key() == "maxiang")
            {
                STL_ite.value() = "31";
            }
            qDebug() << STL_ite.key() << STL_ite.value();
        }
    

    12、QVaraintクラス
    QVaraintはC++の統合(union)データ型に類似しており、QColor、QBrush、QFontなど多くのQtタイプの値を保存できるだけでなく、Qtのコンテナタイプの値も保存できる.
        QByteArray a = QByteArray();  //    
    
        QVariant variant("123");   // Variant      
        QString i = variant.toString();
    
        QDataStream out(&a, QIODevice::ReadWrite);  //        ,       
        out << i;
    
        for (int j = 0; j < a.size(); ++j)
        {
            qDebug() << a.at(j);
        }