Классы контейнеров Qt: общие алгоритмы

В заголовочном файле <QtAlgorithm> Qt предоставляет некоторые глобальные шаблонные функции, которые являются очень часто используемыми алгоритмами, которые можно использовать в контейнерах. Мы можем использовать эти алгоритмы в любом классе-контейнере, который предоставляет итераторы в стиле STL, включая QList, QLinkedList, QVector, QMap и QHash. Если STL можно использовать на целевой платформе, то вместо этих алгоритмов Qt можно использовать алгоритмы STL, потому что STL предоставляет больше алгоритмов, в то время как Qt предоставляет только некоторые из наиболее важных алгоритмов.

Исторически Qt предоставлял функции, которые являются прямыми эквивалентами многих алгоритмических функций STL. Начиная с Qt 5.0, Qt рекомендует нам напрямую использовать реализации, доступные в STL; большинство из них объявлено устаревшим в Qt (хотя их все еще можно использовать для компиляции старого кода с предупреждениями).

В большинстве случаев приложения, использующие устаревшие функции алгоритма Qt, могут быть легко перенесены для использования эквивалентных функций STL. Вам нужно
добавить заголовочный файл #include <algorithm> и заменить функции Qt соответствующими функциями STL, как показано в таблице ниже.

Qt-функция

STL-функция

qBinaryFind

std::binary_search | std::нижняя граница

qКопировать

станд::копировать

qCopyBackward

std::copy_backward

qравно

станд:: равно

qЗаполнить

станд::заполнить

qНайти

станд:: найти

qCount

станд:: количество

qSort

станд:: сортировка

qStableSort

std::stable_sort

qLowerBound

std::нижняя граница

qUpperBound

std::upper_bound

qМеньше

станд:: меньше

qБольше

станд:: больше

Ниже приведена демонстрация нескольких часто используемых алгоритмов.Вы можете проверить ключевое слово Generic Algorithms в справочном указателе, чтобы узнать о других алгоритмах.

(1) Сортировать

Пример алгоритма сортировки выглядит следующим образом:

//使用快速排序算法对list进行升序排序,排序后两个12的位置不确定
QList<int> list1;
list1 << 33 << 12 << 68 << 6 << 12;
std::sort(list1.begin(), list1.end());
qDebug() << list1; // 输出:(6, 12, 12, 33, 68)

//使用一种稳定排序算法对list2进行升序排序,排序前在前面的12,排序后依然在前面
QList<int> list2;
list2 << 33 << 12 << 68 << 6 << 12;
std::stable_sort(list2.begin(), list2.end());
qDebug() << list2; // 输出:(6, 12, 12, 33, 68)

//使用qSort()函数和std::greater算法中使list3反向排序
QList<int> list3;
list3 << 33 << 12 << 68 << 6 << 12;
qSort(list3.begin(), list3.end(), std::greater<int>()); //Qt5已弃用
qDebug() << list3; // 输出:(68, 33, 12, 12, 6)

По умолчанию qSort() будет сравнивать элементы с помощью оператора <, то есть в порядке возрастания. Если вам нужно перейти к убывающему порядку, вам нужно передать qGreater<T>() в качестве третьего параметра функции qSort().

(2) Найти

Пример алгоритма поиска выглядит следующим образом:

//使用std::find()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list1;
list1 << "one" << "two" << "three";
QList<QString>::iterator i = std::find(list1.begin(), list1.end(), "two");
qDebug() << *i; //输出:"two"

//使用qFind()从list中查找"two",返回第一个对应的值的迭代器,如果没有找到则返回end()
QStringList list2;
list2 << "one" << "two" << "three";
QStringList::iterator j = qFind(list2.begin(), list2.end(), "two");
qDebug() << *j; //输出:"two"

Существует также функция qBinaryFind(), которая ведет себя как qFind(), разница в том, что qBinaryFind() — это алгоритм бинарного поиска, который подходит только для поиска в отсортированных коллекциях, а qFind() — это стандартный линейный поиск. В целом метод бинарного поиска более требователен, но и более эффективен.

(3) Копировать

Пример алгоритма репликации выглядит следующим образом:

//将list1中所有项目复制到vect1中
QStringList list1;
list1 << "one" << "two" << "three";
QVector<QString> vect1(list1.count());
std::copy(list1.begin(), list1.end(), vect1.begin());
qDebug() << vect1; //输出:QVector("one", "two", "three")

//将list2中所有项目复制到vect2中
QStringList list2;
list2 << "one" << "two" << "three";
QVector<QString> vect2(list2.count());
qCopy(list2.begin(), list2.end(), vect2.begin());
qDebug() << vect2; //输出:QVector("one", "two", "three")

Статья перенесена из сада блога (fengMisaka): Qt container class three: общий алгоритм - fengMisaka - сад блога

Преимущества этой статьи, плата за получение пакета учебных материалов по разработке Qt, техническое видео, контент включает в себя (основу языка C++, введение в программирование Qt, сигнальный и слотовый механизм QT, рисование изображения разработки интерфейса QT, сеть QT, программирование базы данных QT, бой проекта QT, QSS, OpenCV, модуль Quick, вопросы для интервью и т. д.) ↓↓↓↓↓↓ См. ниже

Supongo que te gusta

Origin blog.csdn.net/QtCompany/article/details/131816614
Recomendado
Clasificación