通用算法
<QtAlgorithms>的头文件声明了在容器类上实现基本算法的一套全局模板函数。这些函数中的大部分都是在STL风格上的迭代器上工作的。
STL 的<algorithm> 头文件提供了一套更为完整的通用算法。这些算法既可以在STL容器类上使用,也可以在 Qt 容器类上使用。如果STL的实现代码在所有平台上都可以得到,那么在没有对应的STL算法时,就没有理由不使用 STL 算法。这里将引入最重要的 Qt 算法。
qFind()算法在容器类中查找一个特定的值。它接受一个"begin" 和一个"end" 选代器,并且返回一个与其匹配的指向第一项的迭代器;如果没有匹配的项,则返回 “end”。在下面的例子中,将 i 设置为 list. begin () + 1,而 j 设置为 list.end()。
QStringList list;
list << "Emma" << "Karl" << "James" << "Mariette";
QStringList::iterator i = qFind(list.begin(), list.end(), "Karl");
QStringList::iterator j = qFind(list.begin(), list.end (), "Petra"} ;
qBinaryFind()算法执行的搜索操作与 qFind()算法相似,其区别在于 qBinaiyFind() 算法假设项都是以升序的顺序存储的,并且使用了快速二分搜索而不是qFind()算法的线性搜索。
qFill()算法采用一个特定的值组装一个容器:
QLinkedList<int> list(10);
qFill(list.begin(), list.end(}, 1009);
与其他基于迭代器的算法类似,也可以通过变化参数以在一部分容器类上使用 qFill()。下面摘录的代码将一个向量的前 5 项初始化为 1009,将后 5 项初始化为 2013:
QVector<int> vect(lO);
qFill(vect.begin(), vect.begin() + 5, 1009);
qFill(vect.end() - 5, vect.end(), 2013);
qCopy()算法将一个容器类的值复制到另一个容器类中:
QVector<int> vect(list.count());
qCopy(list.begin(), list.end(), vect.begin());
qCopy()也可以用来在同一个容器类中复制值,只要数据来源范围与目标范围不重叠。下面是一个代码摘录片段,它利用列表的前两个项复写该列表的后两项:
qCopy(list.begin(), list.begin() + 2, list.end() - 2);
qSort()算法则以升序排列容器类中的项:
qSort(list.begin(), list.end());
默认情况下qSort()使用<操作符对项进行比较。为了以升序排列项,我们将qGreater <T>()作为第三个参数来传递(其中 为容器类的值类型) ,过程如下:
qSort(list.begin(), list.end(), qGreater<int>()) ;
可以用第三个参数来定义用户的排序标准。例如,下面是一个"小于"比较函数,它以不区分大小写的方式比较了不同的 QString:
bool insensitiveLessThan(const QString &str1, const QString &str2)
{
return strl.toLower() < str2.toLower();
}
于是,qSort()的调用变为:
QStringList list;
...
qSort(list.begin(), list.end(), insensitiveLessThan);
qStableSort()算法与 qSort()很相似,但 qStableSort()算法还可以保证进行对等比较的项在排序之后表现出与之前相同的顺序。如果排序标准仅仅考虑值的一部进并且用户可以看到结果,这就非常有用了。
qDeleteAll()算法对每一个存储在容器类中的指针调用 delete。这仅对于那些为指针类型的容器类才有意义的。在调用之后,这些项仍然作为悬摆指针存在于容器类上,因此我们通常也应该在容器类上调用 clear()。例如:
qDeleteAll(list);
list.clear();
qSwap() 算法可以交换两个变量的值,例如:
int x1 = line.x1();
int x2 = line.x2();
if (x1 > x2)
qSwap(x1 , x2);
最后,被所有其他的Qt首部都包括的 <QtGlobal>的头文件,为我们提供了一些有用的定义,其中包括返回参数绝对值的 qAbs() 函数,以及返回最大、最小值的 qMin() qMax()函款。