QT コンテナ クラス QList クラス、QLinkedList クラスおよび QVector クラス QList クラス QLinkedList クラス QVector クラス QMap クラスおよび QHash クラス QMap クラス QHash クラス STL スタイルの反復子
Qt は、一連の汎用テンプレート ベースのコンテナー クラスを提供します。QT コンテナー クラスに格納されるデータは、割り当て可能なデータ型である必要があります。つまり、このデータ型は、既定のコンストラクター、コピー コンストラクター、および代入演算子を提供する必要があります。
このようなデータ型には、基本的なデータ型 (int や double など) や QT の一部のデータ型 (QString、QDate、QTime など) など、一般的に使用されるほとんどのデータ型が含まれますが、QT やその他のサブクラスQObject
( などQWidget QDialog
) はコンテナに格納できず、他のサブクラスへのポインタを格納できますQObject
QList<QToolBar> list; // 无法通过编译
QList<QToolBar*> list; // 通过编译
QT コンテナ クラスはネスト可能
QHash<QString,QList<double>>
[1] QList クラス、QLinkedList クラス、QVector クラス
QList クラス
QList<T>
は、特定のデータ型T
の値の列を格納する、最も一般的に使用されるコンテナー クラスです。から継承されたサブクラスはQList
、などです。QByteArrayList, QItemSelection, QQueue, and QStringList
QList<T>
QList<T>
格納されたリスト項目の内容へのポインタを格納するポインタの配列が維持されます。したがって、QList<T>
添字ベースのクイック アクセスがサポートされています。
さまざまなデータ型に対して、QList<T>
さまざまなストレージ戦略が採用されています。
(1)
T
ポインタまたはポインタ サイズの基本型 (同じバイト数を占める) の場合、QList<T>
値はその配列に直接格納されます。(2)
QList<T>
オブジェクトへのポインタが格納されている場合、そのポインタは実際に格納されているオブジェクトを指します
QLinkedList クラス
QLinkedList<T>
これは連結リストであり、連続していないメモリにデータを格納し、添え字を使用できず、イテレータのみを使用してデータ項目にアクセスできます
QVector クラス
QVector<T>
特定のデータ型T
の一連の値を連続したメモリに格納します。QVector
の先頭または中央への挿入は、データの移動量が多いため遅くなります。QLinkedList<T>
データ項目には、添え字または反復子を使用してアクセスできます。
コンテナーをトラバースするための STL スタイルの反復子
コンテナー クラス | 読み取り専用イテレータ | 読み書きイテレータ |
---|---|---|
QList<T> 、QQueue<T> |
QList<T>::const_iterator |
QList<T>::iterator |
QLinkedList<T> |
QLinkedList<T>::const_iterator |
QLinkedList<T>::iterator |
QVector<T> 、QStack<T> |
QVector::const_iterator | QVector<T>::iterator |
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QList<int> list;
for(int j=0; j<10; j++){
list.append(j);
}
QList<int>::iterator i;
for(i=list.begin();i!=list.end();++i){
qDebug() << (*i);
*i = (*i) * 10;
}
QList<int>::const_iterator ci;
for(ci = list.constBegin();ci!=list.constEnd();++ci){
qDebug() << (*ci);
}
return a.exec();
}
[2] QMap クラスと QHash クラス
QMap
クラスとQHash
クラスには多くの類似した機能がありますが、違いもあります。
QHash
QMap
よりも高速なルックアップがあります。QHash
データ項目は任意の順序で保存しますが、QMap
データは常にKey
キーのQHash
キータイプKey
はoperator==()
グローバルqHash(Key)
機能を提供する必要がありますが、QMap
キータイプKey
はoperator<=()
機能を提供する必要があります
QMap クラス
QMap<Key,T>
Key
type のキーからtypeT
の値へのマップを提供します。
QHash クラス
QHash<Key,T>
QMap
とほぼ同じ API を持っています。データ項目の数に合わせたQHash
サイズのハッシュ テーブルを維持するQHash
コンテナーをトラバースするための STL スタイルの反復子
コンテナー クラス | 読み取り専用イテレータ | 読み書きイテレータ |
---|---|---|
QMap<Key,T> ,QMultiMap<Key,T> |
QMap<Key,T>::const_iterator |
QMap<Key,T>::iterator |
QHash<Key,T> ,QMultiHash<Key,T> |
QHash<Key,T> ,QMultiHash<Key,T>``QHash<Key,T>::const_iterator |
QHash<Key,T>::iterator |
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMap<QString,QString> map;
map.insert("abc","123");
map.insert("def","456");
map.insert("hij","789");
QMap<QString,QString>::const_iterator ci;
for(ci=map.constBegin();ci!=map.constEnd();ci++){
qDebug() << "Key = " << ci.key() << ", Value = " << ci.value();
}
QMap<QString,QString>::iterator i;
i = map.find("abc");
if(i!=map.end()){
i.value() = "000";
}
qDebug() << "------------";
QMap<QString,QString>::const_iterator ci2;
for(ci2=map.constBegin();ci2!=map.constEnd();ci2++){
qDebug() << "Key = " << ci2.key() << ", Value = " << ci2.value();
}
return a.exec();
}