Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7569793
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2013-12-20 14:53:40

Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格

Java 风格的遍历器

Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。
Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置,

每一种容器都有两种 Java 风格的遍历器:一种提供只读访问,一种提供读写访问

容器

只读遍历器

读写遍历器

QList,QQueue

QListIterator

QMutableListIterator

QLinkedList

QLinkedListIterator

QMutableLinkedListIterator

QVector,QStack

QVectorIterator

QMutableVectorIterator

QSet

QSetIterator

QMutableSetIterator

QMap,QMultiMap

QMapIterator

QMutableMapIterator

QHash,QMultiHash

QHashIterator

QMutableHashIterator


QLinkedList
QVectorQSet的遍历器接口与QList的是一样的;QHash遍历器的接口则同QMap是一样的

我们通过下面的代码看看如何使用这种遍历器:

点击(此处)折叠或打开

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3.  
  4. QListIterator<QString> i(list);
  5. while (i.hasNext()) {
  6.     qDebug() << i.next();
  7. }


如果需要修改操作,我们可以使用QMutableListIterator。来看下面的代码:

点击(此处)折叠或打开

  1. QMutableListIterator<int> i(list);
  2. while (i.hasNext()) {
  3.     if (i.next() == “B”) {
  4.         i.setValue(“b”);     //i.next()="b";
  5.     }
  6. }

QMapItrator也是类似的。例如,

点击(此处)折叠或打开

  1.    QMap<int, QString> map;
  2.    map.insert(1,"A");
  3.    map.insert(2,"B");
  4.    map.insert(3,"C");

  5.    QMapIterator<int, QString> i(map);
  6.    while (i.hasNext()) {
  7.        if(i.next().key() == 2)
  8.            qDebug() << i.value();
  9.    }

 

STL 风格的遍历器

STL 风格的遍历器从 Qt 2.0 就开始提供。这种遍历器能够兼容 Qt 和 STL 的通用算法,并且为速度进行了优化。同 Java 风格遍历器类似,Qt 也提供了两种 STL 风格的遍历器:一种是只读访问,一种是读写访问。我们推荐尽可能使用只读访问,因为它们要比读写访问的遍历器快一些。

容器

只读遍历器

读写遍历器

QList,QQueue

QList::const_iterator

QList::iterator

QLinkedList

QLinkedList::const_iterator

QLinkedList::iterator

QVector,QStack

QVector::const_iterator

QVector::iterator

QSet

QSet::const_iterator

QSet::iterator

QMap,QMultiMap

QMap::const_iterator

QMap::iterator

QHash,QMultiHash

QHash::const_iterator

QHash::iter


不同于 Java 风格遍历器,STL 风格遍历器直接指向
元素本身

下面是有关QList的相关代码:

点击(此处)折叠或打开

  1. QList<QString> list;
  2. list << "A" << "B" << "C" << "D";
  3.  
  4. QList<QString>::iterator i;
  5. for (i = list.begin(); i != list.end(); ++i) {
  6.   *i = (*i).toLower(); // 使用 * 运算符获取遍历器所指的元素
  7.    qDebug()<<*i;
  8. }


QMap和QHash的遍历器,运算符返回集合键值对。下面的代码,我们打印出QMap的所有元素:

点击(此处)折叠或打开

  1. QMap<int, int> map;
  2.  
  3. QMap<int, int>::const_iterator i;
  4. for (i = map.constBegin(); i != map.constEnd(); ++i) {
  5.     qDebug() << i.key() << ":" << i.value();
  6. }

foreach关键字

如果我们仅仅想要遍历集合所有元素,我们可以使用 Qt foreach关键字。这个关键字是 Qt 特有的,

例如,我们使用foreachQLinkedList进行遍历:


点击(此处)折叠或打开

  1. QLinkedList<QString> list;
  2. ...
  3. QString str;
  4. foreach (str, list) {
  5.     qDebug() << str;
  6. }
 
返回目录:Qt学习整理
阅读(20285) | 评论(0) | 转发(0) |
0

上一篇:Qt 存储容器

下一篇:Qt简单模型

给主人留下些什么吧!~~