Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且他们进行了速度和存储的优化,因此可以减少可执行文件的大小。此外,他们还是线程安全的,也就是说他们作为只读容器时可被多个线程访问。
(隐式共享:是对象的管理方法。一个对象被隐式共享,只是传递该对象的一个指针给使用者,而不实际复制对象数据,只有在使用者修改数据时,才实质复制共享对象给使用者。)
一、顺序容器类
Qt的顺序容器类有:QList、QLinkedList、QVector、QStack和QQueue。
1.QList
insert()、replace()、removeAt()、move()、swap()、append()、prepend()、removeFirst()、removeLast()等。
QList<QString> list; list << "one" << "two" << "three"; QString str1 = list[1]; //str1 =="two" QString str0 = list.at(0); //str0 =="one"
2.QLinkedList
QLinkedList<T>是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。
3.QVector
QVector<T>提供动态数组的功能,以下标索引访问数据。
QVector的函数接口与QList几乎完全相同,QVector<T>的性能比QList<T>更高,因为QVector<T>的数据项是连续存储的。
4.QStack
QStack<T>提供类似于堆栈的后入先出操作的容器类,push()和pop()是主要的接口函数。
QStack<int> stack; stack.push(10); stack.push(20); stack.push(30); while(!stack.isEmpty()) cout << stack.pop() << endl;
5.QQueue
QQueue<T>是提供类似于队列先入先出操作的容器类,enqueue()和dequeue()是主要操作函数。
QQueue<int> queue; queue.enqueue(10); queue.enqueue(20); queue.enqueue(30); while(!queue.isEmpty()) cout << queue.dequeue() << endl;
二、关联容器类
Qt的关联容器类有:QSet、QMap、QMultiMap、QHash和QMultiHash。
1.QSet
QSet是基于散列表的集合模板类,他存储数据的顺序是不定的,查找值的速度非常快。
QSet<QString> set; set << "dog" << "cat" << "tiger"; if(!set.contains("cat")) .....
2.QMap
QMap<Key, T>提供一个字典,一个键映射到一个值。QMap存储数据是按照键的顺序,如果不在乎存储顺序,使用QHash会更快。
QMap<QString, int> map; map["one"] = 1; map["two"] = 2; map["three"] = 3; map.insert("four", 4); map.remove("two"); int num1 = map["one"]; int num2 = map.value("two");
3.QMultiMap
QMultiMap是QMap的子类,是用于处理多值映射的遍历类。也就是一个键对应多个值。
QMultiMap不提供"[]"操作符,使用value()函数访问最新插入的键的单个值。如果要获取一个键对应的所有值,使用values()函数,返回值是QList<T>类型。
QMultiMap<QString, int> map1, map2, map3; map1.insert("plenty", 100); map1.insert("plenty", 2000); map2.insert("plenty", 5000); map3 = map1 + map2; QList<int> values = map.values("plenty"); for(int i = 0; i < values.size(); i++) cout << values.at(i) << endl;
4.QHash是基于散列表来实现字典功能的模板类,QHash<Key, T>存储的键值对具有非常快的查找速度。用法和QMap,QMultiHash用法和QMultiMap相同。
Study in 《Qt5.9 C++开发指南》