您的位置:首页 > 编程语言 > Qt开发

Qt的容器类之容器,迭代器

2016-12-13 13:55 267 查看


 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采用了隐式共享技术,这个复制操作会很快完成。如果用户希望在迭代的过程中修改原容器,就应该使用迭代器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt 容器类