Qt的容器类
Qt的容器类是隐式共享的,它们优化了速度、低内存消耗和最小的内联代码扩展,所以就有了更小的可执行文件。
它们在做只读容器的情况下他们是线程安全的。
遍历容器中的项,有两种迭代器可以选择:
- JAVA风格迭代器
- STL风格迭代器
Qt还提供了一个foreach关键字,可以非常容易遍历顺序容器中的项。
容器类(Container Class)
Qt提供的顺序容器: QList ,QLinkedList ,QVector ,QStack 和 QQueue 。
关联性容器: QMap ,QMultiMap , QHash , QMultiHash 和 QSet。
Container Class | 描述 |
---|---|
QList<T> | (常用),QList使用数组实现,它可以通过索引访问的给定类型(T)的值 |
QLinedList<T> | 类似QList,它使用迭代器而QList使用整数索引来访问项。中间插入值时,它比QList有着更好的性能。(只要QLinkedList中的项存在,指向该项的迭代器就仍然有效,而指向QList的迭代器在任何插入或删除之后都可能无效。) |
QVector<T> | 它将给定类型的值存储在内存中的相邻位置。在前面或中间插入可能非常缓慢,因为它可能导致大量的项必须在内存中移动一个位置。 |
QStack<T> | 这是QVector的一个方便的子类,它提供了“后进先出”(LIFO)语义。 |
QQueue<T> | 这是QList的一个方便的子类,它提供了“先入先出”(FIFO)语义。 |
QSet<T> | 这提供了一个具有快速查找功能的集合 |
QMap<Key,T> | 这提供了一个字典(关联数组),它将类型为Key的键映射到类型为T的值。以Key进行排序存储(升序)。 |
QMultiMap<Key,T> | QMap的子类,它为多值映射提供了接口,即一个键可以与多个值相关联的映射。以Key进行排序存储(升序)。 |
QHash<Key,T> | 具有QMap几乎相同的API,但提供了显著更快的查找。QHash以任意顺序存储数据(随机存储) |
QMultiHash<Key,T> | 这是QHash的一个方便的子类,它为多值散列提供了一个很好的接口。(随机存储) |
迭代器
关于两者比较:java风格迭代器,它的性能没有STL迭代器好,但是书写方便。
容器 | JAVA只读 | JAVA可读可写 | STL只读 | STL可读可写 |
---|---|---|---|---|
QList<T> ,QQueue<T> | QListIterator<T> | QMutableListIterator<T> | QList<T>::const_iterator | QList<T>::iterator |
QLinkedList<T> | QLinkedListIterator<T> | QMutableLinkedListIterator<T> | QLinkedList<T>::const_iterator | QLinkedList<T>::iterator |
QVector<T> ,QStack<T> | QVectorIterator<T> | QMutableVectorIterator<T> | QVector<T>::const_iterator | QVector<T>::iterator |
QSet<T> | QSetIterator<T> | QMutableSetIterator<T> | QSet<T>::const_iterator | QSet<T>::iterator |
QMap<Key,T> ,QMultiMap<Key,T> | QMapIterator<Key,T> | QMutableMapIterator<Key,T> | QMap<Key,T>::const_iterator | QMap<Key,T>::iterator |
QHash<Key,T> ,QMultiHash<Key,T> | QHashIterator<Key,T> | QMutableHashIterator<Key,T> | QHash<Key,T>::const_iterator | QHash<Key,T>::iterator |
QList 迭代器:
QList<int> list;
//JAVA风格
QListIterator<int> ite1(list); //只读
QMutableListIterator<int> ite2(list); //可读可写
//JAVA风格迭代器使用
while(ite1.hasNext())
{
qDebug() << ite1.next();
}
//STL风格
QList<int>::const_iterator constStlListIte = list.begin(); //只读
QList<int>::iterator stlListIte = list.begin(); //可读可写
//STL风格迭代器使用
for(;constStlListIte != list.end();constStlListIte++)
{
qDebug() << *constStlListIte;
}
QLinkedList 迭代器:
QLinkedList <int> linkedList;
//JAVA风格
QLinkedListIterator<int> constJavaLinkIte(linkedList); //只读
QMutableLinkedListIterator<int> javaLinkIte(linkedList); //可读可写
//STL风格
QLinkedList<int>::const_iterator constStlLinkIte = linkedList.begin(); //只读
QLinkedList<int>::iterator stlLinkIte = linkedList.begin(); //可读可写
… 它们的写法差不多一致,下面介绍以下QMap这些的写法
QMap 迭代器:
QMap<int,int> map;
//JAVA风格
QMapIterator<int,int> constJavaMapIte(map);
while(constJavaMapIte.hasNext())
{
qDebug() << "key = " << constJavaMapIte.key() << " value = " << constJavaMapIte.next().value() << endl;
}
//STL风格
QMap<int,int>::const_iterator constStlMapIte = map.begin();
for(;constStlMapIte != map.end();constStlMapIte++)
{
qDebug() << "key = " << constStlMapIte.key() << " value = " << constStlMapIte.value() << endl;
}
…QHash的写法与QMap的写法也差不多一致,接下来还有介绍最后一个 foreach 遍历
foreach 关键字可以用来遍历 顺序容器 不能遍历 关联性容器。
QList<int> list;
foreach(int value,list)
{
qDebug() << value;
}