在<QtAlgorithms>头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法。我们可以在任何提供了STL风格迭代器的容器类上使用这些算法,包括QList、QLinkedList、QVector、QMap和QHash。
如果在目标平台上可以使用STL,那么可以使用STL的算法来代替Qt的这些算法,因为STL提供了更多的算法,而Qt只提供了其中最重要的一些算法。
在历史上,Qt曾经提供的函数是许多STL算法函数的直接等价物。从Qt 5.0开始,QT鼓励我们直接使用STL中可用的实现;大多数Qt已经被弃用(尽管它们仍然可以用于保持旧的代码编译)。
大多数情况下,使用废弃的Qt算法函数的应用程序可以很容易地移植到使用等效的STL函数。你需要
添加#include <algorithm> preprocessor指令;将Qt函数替换为STL对应函数,如下表所示。
Qt function | STL function |
qBinaryFind | |
qCopy | |
qCopyBackward | |
qEqual | |
qFill | |
qFind | |
qCount | |
qSort | |
qStableSort | |
qLowerBound | |
qUpperBound | |
qLess | |
qGreater | |
实例:
QStringList list;
list << "one" << "two" << "three";
qDebug() << QObject::tr("qCopy()算法:");
QVector<QString> vect(3);
// 将list中所有项目复制到vect中
std:copy(list.begin(), list.end(), vect.begin());
qDebug() << vect; //结果为one,two,three
qDebug() << endl << QObject::tr("qEqual()算法:");
// 从list的开始到结束的所有项目与vect的开始及其后面的等数量的项目进行比较,
// 全部相同则返回true
bool ret1 = std:equal(list.begin(), list.end(), vect.begin());
qDebug() << "euqal: " << ret1; //结果为true
qDebug() << endl << QObject::tr("qFind()算法:");
// 从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QList<QString>::iterator i = std:find(list.begin(), list.end(), "two");
qDebug() << *i; // 结果为"two"
STD常用算法: