泛型算法
<QtAlgorithms>头文件声明了一组全局模板函数,这些函数实现了作用在容器上的基本算法。 这些函数中的多数使用STL风格迭代器。
STL头文件<algorithm>提供更完整的泛型算法集合。 这些算法可以被用在Qt容器上以及STL容器上。 如果在你的所有平台上STL实现可用,当Qt缺少一个相同的算法的时候,那么可能没有理由去避开使用STL算法,。 这里,我们将介绍最重要的Qt算法。
qFind()算法在容器中查找某一个值。 它接收一个“beging”和一个“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()那样执行查找,然而它假设条目是按升序排列并使用快速二分查找而不是qFind()的线性查找。
qFill()用某一个值来填充容器。
QLinkedList<int> list(10); qFill(list.begin(), list.end(), 1009);
像其他基于迭代器的算法,通过变换参数,我们也可以在容器的一部分上使用qFill()。 下面的代码片段将向量中的前五个条目初始化为1009并将最后五个条目初始化为2013。
QVector<int> vect(10); qFill(vect.begin(), vect.begin() + 5, 1009); qFill(vect.end() - 5, vect.end(), 2013);
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>()作为第三个参数传递(T是容器的值类型),像这样:
qSort(list.begin(), list.end(), qGreater<int>());
我们可以使用第三个参数来定义排序标准。 例如,这里有一个 "less than" 比较函数,它用大小写不敏感(case-insensitive)的方式比较QString:
bool insensitiveLessThan(const QString &str1, const QString &str2) { return str1.toLower() < str2.toLower(); }
qSort()的调用变成这样
QStringList list; ... qSort(list.begin(), list.end(), insensitiveLessThan);
qStableSort()算法和qSort()类似,除了它保证相等的两个条目在排序后和排序前的顺序保持不变。 这个是有用的,如果排序标准只考虑一个值的某些部分并且结果对用户可视。 我们在第四章的Spreadsheet程序(p. 88)中使用了qStableSort()来实现排序。
qDeleteAll()算法在每个存储在容器中的指针上调用delete。 只有容器的值类型是指针类型时,它才有意义。 这个之后,容器的条目还存在,直到调用clear()。 例如:
qDeleteAll(list); list.clear();
qSwap()算法交换两个变量的值。 例如:
int x1 = line.x1(); int x2 = line.x2(); if (x1 > x2) qSwap(x1, x2);
最后,<QtGlobal>头文件,被包含在每个其他Qt的头文件中,提供若干有用的定义,包括qAbs()函数(返回一个数的绝对值),和qMin()及qMax()函数(返回两个值中的最小或最大的)。