Qt的容器类之容器,迭代器
此文乃《Qt中的C++技术》的读书笔记。若喜欢,请支持图书作者。QT中的容器被分为两个大类:容器元素是一个值的,比如QVector,以及容器元素是一个(key, value)对的,比如QMap。
·
QT中的容器被分为两个大类:容器元素是一个值的,比如QVector<T>,以及容器元
素是一个(key, value)对的,比如QMap<Key, T>。
(1)第一大类中,QVector<T>将其所有元素存放在一块连续的内存中。随机访问的速度很快,
但是插入/删除操作很慢。
QStack<T>是QVector<T>的子类,实现栈的功能。除了具有
QVector<T>的所有功能,它的成员函数push(). pop(). top()实现栈的操作。
QList<T>在内部使用一个指针数组指向容器元素。能够快速随机访问每个元素。在容器
首、尾添加元素的速度也较快。但是,当元素数量较多而需要在容器中间插入新元素时,需
要移动大量的指针,性能会降低。
QStringList是QList<QString>的子类,能高效地处理字符串列表。比如,它支持运算符
,’<<”,以向容器中插入若干字符串。它的成员函数join()能够将所有字符串拼接起来,成员
函数filter()能够使用正则表达式搜索字符串列表。
QQueue<T>是QList<T>的子类,实现了队列的功能。除了具有QList的所有功能外,它
的成员函数enqueue()将一个新元素添加到容器尾部,dequeue()从容器首部删除一个元素,
head()访问但是不删除首部元素。
QLinkedList<T>能够在很短而且固定的时间内完成元素的插入/删除操作,但是排序、查
找操作却较慢。
(2)第二大类中,QMap<Key,T> 的元素具有(key,value)形式。所有元素按照key的取值排序,
因而搜索速度很快。一个容器的多个元素都具有相同的key。虽然QMap也能处理这种情况,
但是处理方式烦琐。QMultiMap<Key, T>能够更有效地处理这种情形。它是QMap的子类,
除了具有QMap的绝大部分功能,它的insert函数允许新元素的key和己有元素的key相同。
它不支持运算符“[]”,取而代之的是函数values(),该函数返回所有具有指定key值的元素,
并将它们存放在一个QList对象中。
QHash<Key, T>的元素也具有(key,value)的形式。它使用哈希表存取key,因而能够快速
地依据key定位某个元素,这个操作的速度比QMap的快。但是,QHash中的元素并没有按
照key的取值排序,降低了搜索的性能。为了处理多个元素具有相同key的情形,QHash也
具有一个子类QMultiHash<Key, T>,其功能与QMultiMap类似。
QSet<T>内部使用QHash实现集合的功能。QHash的每个元素具有(key,value)形式,
QSet<T>令key为T, value为空。由于使用了QHash, QSet能够快速完成集合的插入、元素
定位操作。成员函数unite()合并两个集合,intersect()求取两个集合的交集,substract()求取两
个集合之差,contains()判断一个集合是否含有某个元素。
QCache<Key, T>的元素也具有(key,value)的形式。和其他容器不同,QCache所能存放的
元素数量被有意地限定。当有新元素需要被插入到容器中时,最近使用频率最低的那些元素
会被删除。
如何遍历一个容器,两种方法,第一使用迭代器,第二使用Qt定义的关键字foreach。
foreach最终依靠迭代器来完成遍历操作,但是使用方法很简洁。一般格式如下:
foreach (variable ,container) statement;
其中variable的类型应该和container中元素的类型一致。如果这个类型的名字中不含有逗号,
这个变量可以在foreach内部定义,不必提前定义。
例如:1.使用迭代器
QList<QString> list;
list << "A" << "B" << "C" << "D";
QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
qDebug()<< *i ;
2.使用foreach
QLinkedList<QString> list;
list << "A" << "B" << "C" << "D";
foreach (const QString &str, list)
qDebug() << str;
foreach在遍历一个容器前,会复制该容器,然后对复制的版本进行遍历。如果在遍历的
过程中修改了容器元素的值,那也只是修改这个复制版本,对原容器不会产生任何影响。由于
Qt采用了隐式共享技术,这个复制操作会很快完成。如果用户希望在迭代的过程中修改
原容器,就应该使用迭代器。
更多推荐
已为社区贡献1条内容
所有评论(0)