通用算法
关于 Qt 的 model-view 部分就告一段落,今天我们开始新的部分。或许有些朋友觉得前面的部分说得很简单。对此我也没有办法,毕竟,Qt 是一个很庞大的库,一时半会根本不可能穷尽所有内容,并且我也有很多东西不知道,有时候也必须去查找资料才能明白。
今天开始的部分是关于 Qt 提供的一些通用算法。这部分内容来自 C++ GUI Programming with Qt 4, 2nd Edition。
提供了一系列通用的模板函数,用于实现容器上面的基本算法。这部分算法很多依赖于STL 风格的遍历器(还记得前面曾经说过的 Java 风格的遍历器和 STL 风格的遍历器吗?)。实际上,C++ STL 也提供了很多通用算法,包含在头文件内。这部分算法对于 Qt 容器同样也是适用的。因此,如果你想使用的算法在 Qt 的头文件中没有包含,那么就可以使用 STL 的算法代替,这并不会产生什么冲突。这里我们来说几个 Qt 中的通用算法。虽然这些算法都是很简单的,但是,库函数往往会比自己编写的更有效率,因此还是推荐使用系统提供的函数的。
首先是 qFind()函数。qFind()函数会在容器中查找一个特定的值。它的参数中有一个起始位置和终止位置,如果被查找的元素存在,函数返回第一个匹配项的位置,否则则返回终止位置。注意,我们这里说的“位置”,实际上是 STL 风格的遍历器。我们知道,使用 STL 风格遍历器是可以反映一个位置的。例如下面的例子,i 的值将是 list.begin() + 1,而 j 会是list.end():
```
QStringList list;
list list(10);
qFill(list.begin(), list.end(), 1009);
```
正如其他基于遍历器的算法一样,qFill()也可以针对容器的一部分进行操作,例如下面的代码将会把vector 的前5位设置成1009,而最后5位设置为2013:
```
QVector vect(10);
qFill(vect.begin(), vect.begin() + 5, 1009);
qFill(vect.end() - 5, vect.end(), 2013);
```
qCopy()算法可以实现将一个容器中的元素复制到另一个容器,例如:
```
QVector vect(list.count());
qCopy(list.begin(), list.end(), vect.begin());
```
qCopy()也可以用于同一容器中的元素的复制。qCopy()操作成功的关键是源容器和目的容器的范围不会发生溢出。例如如下代码,我们将把一个列表的最后两个元素复制给前两个元素:
```
qCopy(list.begin(), list.begin() + 2, list.end() - 2);
```
qSort()实现了容器元素的递增排序,使用起来也很简单:
```
qSort(list.begin(), list.end());
```
默认情况下,qSort()将使用 ()当作第三个参数传给 qSort()函数。例如:
```
qSort(list.begin(), list.end(), qGreater());
```
注意,这里的 T 实际上是容器的泛型类型。实际上,我们可以利用第三个参数对排序进行定义。例如,我们自定义的数据类型中有一个大小写不敏感的 QString 的小于比较函数:
```
bool insensitiveLessThan(const QString &str1, const QString &str2)
{
return str1.toLower() x2)
qSwap(x1, x2);
```
最后,在头文件中,也定义了几个有用的函数。这个头文件被其他所有的头文件 include了,因此你不需要显式的 include 这个头文件了。
在这个头文件中有这么几个函数:qAbs()返回参数的绝对值,qMin()和 qMax()则返回两个值的最大值和最小值。
本文出自 “豆子空间” 博客,请务必保留此出处 [http://devbean.blog.51cto.com/448512/193918](http://devbean.blog.51cto.com/448512/193918)