Qtコンテナクラスとその遍歴(JavaスタイルとSTLスタイルの反復器)
11714 ワード
1、Qtは、汎用的なテンプレートベースのコンテナクラスのセットを提供する.QtのコンテナクラスはC++の標準準テンプレートライブラリのコンテナクラスと比較して、より軽量で、より安全で、より使いやすい.また,Qtのコンテナクラスは速度,メモリ消費,インラインコードなどの面で最適化されている.
2.Qtコンテナクラスに格納されているデータは、付与可能なデータ型である必要があります.すなわち、このデータ型は、パラメータを必要としないコンストラクタ、レプリケーションコンストラクタ、および付与操作演算子を提供する必要があります.
3.これらのデータ型には、基本データ型(int、doubleなど)やQtなど、一般的に使用されるデータ型の大部分(QString、Qdate、QTimeなど)が含まれています.ただし、QtのQObjectおよびそのサブクラス(QWidget、QDidialogなど)は、コンテナに格納できません.たとえば、次のようになります.
ただし、QObjectおよびそのサブクラスのポインタを格納することができる.例:
4**、Qtのコンテナクラスは、ネスト可能な**です.たとえば、次のようになります.
注:最後の2つの">"の間にスペースを残す必要があります.そうしないと、コンパイラは2つの">"を1つの">>"と解釈し、コンパイルできません.
5、Qtの容器類には2つの遍歴方法がある:(1)Java風の反復器;(2)STL風の反復器、効率はやや優れている.
6、QListクラス:QListは、QListに格納されたリスト項目の内容を指すポインタ配列を維持する.したがって、QListは、下付き文字に基づく高速アクセスを提供する.例:
7、QLinedListクラス:下付き文字は使用できません.反復器を使用してデータ項目にアクセスするしかありません.
8、QVectorクラス:下付き文字を使用してデータ項目にアクセスするか、反復器を使用してデータ項目にアクセスすることができます.
9、Javaスタイル反復器コンテナ遍歴:Qtは各コンテナクラスに対して2種類のJavaスタイル反復器データ型、すなわち、読み取り専用アクセスと読み書きアクセスを提供する.
たとえば、Listクラスの場合、読み取り専用反復器クラス:QListIterator;読み書き反復器クラス:QMutableListIterator.
Javaスタイル反復器の反復点は、リスト項目を直接指すのではなく、リスト項目の真ん中にあります.したがって、その反復点は、最初のリスト項目の前にあるか、2つのリスト項目の間にあるか、最後のリスト項目の後にあるかのいずれかです.
(1)QList読み取り専用遍歴:
(2)QList読み書き遍歴:
10**、STLスタイルの反復器コンテナ**:Qtは、各コンテナクラスについて、STLスタイルの反復器データ型、すなわち、読み取り専用アクセスと読み書きアクセスの2種類を提供します.(読み取り専用反復器の動作速度が速い)
STLスタイルの反復器のAPIは、ポインタ操作に基づいて構築されています.たとえば、「++」操作演算子は反復器を次のアイテム(item)に移動し、「*」オペレータは反復器が指すアイテムを返します.
Javaスタイルの反復器とは異なり、STLスタイルの反復点はリスト項目を直接指します.
例:QListの読み取り専用反復器クラス:QList::const_iterator;読み書き反復器クラス:QList::iterator
11、QMapクラスとQHashクラス
(1)違い: QHashクラスの検索速度が速い. QHashは任意の順序でデータ項目を格納する. QHashのキータイプKeyはoperator==()とグローバルqHash(Key)関数を提供する必要がありますが、QMapのキータイプKeyはoperatorを提供する必要があります.
(2)QMapクラス:ワンタッチ多値をサポートするため、QMapはQMapを提供する STLスタイル:
12、QVaraintクラス
QVaraintはC++の統合(union)データ型に類似しており、QColor、QBrush、QFontなど多くのQtタイプの値を保存できるだけでなく、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)違い:
(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();
}
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);
}