一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

  QT提供了两种风格的遍历器:Java 和 STL

一、Java风格遍历器
  Java 风格的遍历器是 Qt 首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置。每一种容器都有两种 Java 风格的遍历器:一种提供只读访问,一种提供读写访问:

以QVector为例,只读遍历的demo代码如下:

1 QVector<QString> vct = {"A","B","C","D","E"};
2 QVectorIterator<QString> itr(vct);
3 while (itr.hasNext())
4 {
5     qDebug() << "itr.next()=" << itr.next();
6 }

输出结果如下:

1 itr.next()= "A"
2 itr.next()= "B"
3 itr.next()= "C"
4 itr.next()= "D"
5 itr.next()= "E"

如果需要修改其中容器的值,代码如下:

1 QVector<QString> vct = {"A","B","C","D","E"};
2 QMutableVectorIterator<QString> mitr(vct);
3 while (mitr.hasNext())
4 {
5     if (mitr.next() == "C")
6     {
7         mitr.setValue("v");
8     }
9 }

QMap的遍历也是类似

 1 QMap<int, QString> map;
 2 map.insert(1, "Apple");
 3 map.insert(2, "Banana");
 4 map.insert(3, "Cherry");
 5 map.insert(4, "Grape");
 6 
 7 QMapIterator<int, QString> itr(map);
 8 while (itr.hasNext()) {
 9     if (itr.next().key() < 3)
10         qDebug() << itr.value();
11 }

二、STL风格遍历器

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

QList遍历

1 QList<QString> lst;
2 lst << "Apple" << "Banana" << "Cherry" << "Grape";
3 QList<QString>::iterator itr = lst.begin();
4 for (itr; itr != lst.end(); ++itr) {
5     qDebug() << *itr;
6 }

QMap遍历

1 QMap<int, QString> map = {
2         {1, "Apple"},
3         {2, "Banana"},
4         {3, "Cherry"}
5     };
6 QMap<int, QString>::const_iterator citr = map.constBegin();
7 for (citr; citr != map.constEnd(); ++citr) {
8     qDebug() << citr.key() << ":" << citr.value();
9 }

输出结果如下:

1 1 : "Apple"
2 2 : "Banana"
3 3 : "Cherry"

 

posted on 2024-04-11 19:53  一杯清酒邀明月  阅读(212)  评论(0编辑  收藏  举报