泛型算法

泛型算法

<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);

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>()作为第三个参数传递(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()函数(返回两个值中的最小或最大的)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值