1 容器
QT类库提供了容器类和STL中的差不多,但更加轻巧安全,QT容器时隐式共享和可重入的,并且线程安全,可以被多个线程读取(写入不是线程安全)。
隐式共享是对象的管理方法。一个对象被隐式共享,只是传递该对象的一个指针给使用者,而不实际复制对象数据,只有在使用者修改数据时,才实质复制共享对象给使用者。并且即当有一个迭代器在操作一个容器变量时,不要去复制这个容器变量。以此保证线程安全。
2 迭代器
对于每一个容器类,都有两个迭代器:一个用于只读访问,一个用于读写访问。无需修改数据时一定使用只读迭代器,因为它们速度更快。
2.1 java风格迭代器
容器类 | 只读迭代器 | 读写迭代器 |
---|---|---|
QList |
QListItcrator |
QMutableListItcrator |
QLinkedList |
QLinkedListIterator |
QMutableLinkedListIterator |
QVector |
QVectorllcrator |
QMutableVectorIterator |
QSet |
QSetItcrator |
QMutableSetItcrator |
QMap |
QMapIterator |
QMutableMapIterator |
QHash |
QHashIterator |
QMutablcHashlterator |
使用示例如下:
QList<QString> list;
list << "A" << "B" << "C" << "D";
QListIterator<QString> i (list);
while (i.hasNext())
qDebug () << i.next ();
2.2 STL风格迭代器
STL 迭代器与 Qt 和 STL 的原生算法兼容,并且进行了速度优化,比java风格的效率高:
容器类 | 只读迭代器 | 读写迭代器 |
---|---|---|
QList |
QList |
QList |
QLinkedList |
QLinked List<1>: :const_iterator | QLinkedList |
QVector |
QVector |
QVector |
QSet |
QSet |
QSet |
QMap |
QMap |
QMap |
QHash |
QHash |
QHash |
同样以QList作为示例:
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::const_iterator i;
for (i = list.constBegin(); i != list.constEnd(); ++i)
qDebug() << *i;