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采用了隐式共享技术,这个复制操作会很快完成。如果用户希望在迭代的过程中修改 原容器,就应该使用迭代器。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐