<QtAlgorithms> - Универсальные алгоритмы
Заголовок <QtAlgorithms> содержит универсальные, основанные на шаблонах алгоритмы. Подробнее...
| Заголовок: | #include <QtAlgorithms> |
Функции
| uint | qCountLeadingZeroBits(quint8 v) |
| uint | qCountLeadingZeroBits(quint16 v) |
| uint | qCountLeadingZeroBits(quint32 v) |
| uint | qCountLeadingZeroBits(quint64 v) |
| uint | qCountTrailingZeroBits(quint8 v) |
| uint | qCountTrailingZeroBits(quint16 v) |
| uint | qCountTrailingZeroBits(quint32 v) |
| uint | qCountTrailingZeroBits(quint64 v) |
| void | qDeleteAll(ForwardIterator begin, ForwardIterator end) |
| void | qDeleteAll(const Container &c) |
| uint | qPopulationCount(quint8 v) |
| uint | qPopulationCount(quint16 v) |
| uint | qPopulationCount(quint32 v) |
| uint | qPopulationCount(quint64 v) |
Подробное описание
Qt предоставляет ряд глобальных шаблонных функций в <QtAlgorithms>, которые работают с контейнерами и выполняют небольшие задачи, чтобы упростить работу, такие как qDeleteAll(), которая вызывает operator delete для всех элементов в заданном контейнере или в заданном диапазоне. Вы можете использовать эти алгоритмы с любым классом контейнера, который предоставляет итераторы в стиле STL, включая Qt QList, QMap и QHash.
Большинство алгоритмов принимают итераторы в стиле STL в качестве параметров. Алгоритмы являются универсальными в том смысле, что они не привязаны к конкретному классу итераторов; вы можете использовать их с любыми итераторами, которые соответствуют определенному набору требований.
Разные алгоритмы могут иметь разные требования к принимаемым ими итераторам. Типы итераторов, необходимые для каждого алгоритма, указаны для каждого алгоритма. Если передается итератор неправильного типа (например, QList::ConstIterator передаётся как итератор вывода), вы всегда получите ошибку компилятора, хотя и не обязательно очень информативную.
Некоторые алгоритмы имеют особые требования к типу значения, хранимому в контейнерах. Например, qDeleteAll() требует, чтобы тип значения был типом указателя, не являющимся константным (например, QWidget *). Требования к типу значения указаны для каждого алгоритма, и компилятор выдаст ошибку, если требование не выполняется.
Универсальные алгоритмы могут использоваться с другими классами контейнеров, отличными от предоставляемых Qt и STL. Синтаксис итераторов в стиле STL смоделирован по образцу указателей C++, поэтому можно использовать обычные массивы в качестве контейнеров и обычные указатели в качестве итераторов.
Типы итераторов
Алгоритмы имеют определенные требования к типам итераторов, которые они принимают, и эти требования указаны индивидуально для каждой функции. Компилятор выдаст ошибку, если требование не выполняется.
Итераторы ввода
Итератор ввода — это итератор, который может использоваться для последовательного чтения данных из контейнера. Он должен предоставлять следующие операторы: == и != для сравнения двух итераторов, унарный * для получения значения, хранящегося в элементе, и префиксный ++ для перехода к следующему элементу.
Типы итераторов контейнеров Qt (постоянные и непостоянные) — все итераторы ввода.
Итераторы вывода
Итератор вывода — это итератор, который может использоваться для последовательной записи данных в контейнер или в какой-либо выходной поток. Он должен предоставлять следующие операторы: унарный * для записи значения (т.е., *it = val) и префиксный ++ для перехода к следующему элементу.
Типы непостоянных итераторов контейнеров Qt — все итераторы вывода.
Итераторы вперёд
Итератор вперёд — это итератор, который удовлетворяет требованиям как итераторов ввода, так и итераторов вывода.
Типы непостоянных итераторов контейнеров Qt — все итераторы вперёд.
Двунаправленные итераторы
Двунаправленный итератор — это итератор, который удовлетворяет требованиям итераторов вперёд, но который, помимо этого, поддерживает префиксный -- для обратного перехода.
Типы непостоянных итераторов контейнеров Qt — все двунаправленные итераторы.
Итераторы произвольного доступа
Последняя категория, итераторы произвольного доступа, является наиболее мощным типом итератора. Он поддерживает все требования двунаправленного итератора и поддерживает следующие операции:
i += n |
перемещает итератор i на n позиций вперёд |
i -= n |
перемещает итератор i на n позиций назад |
i + n или n + i
|
возвращает итератор для элемента, расположенного на n позиций вперёд от итератора i
|
i - n |
возвращает итератор для элемента, расположенного на n позиций назад от итератора i
|
i - j |
возвращает количество элементов между итераторами i и j
|
i[n] |
то же, что и *(i + n)
|
i < j |
возвращает true, если итератор j следует за итератором i
|
QList's непостоянный тип итератора — итератор произвольного доступа.
См. также классы контейнеров и <QtGlobal>.
Документация по функциям
[since 5.6] uint qCountLeadingZeroBits(quint8 v)
Возвращает количество последовательных нулевых битов в v, при поиске с старшего бита. Например, qCountLeadingZeroBits(quint8(1)) возвращает 7, а qCountLeadingZeroBits(quint8(8)) возвращает 4.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountLeadingZeroBits(quint16 v)
Возвращает количество последовательных нулевых битов в v, при поиске с старшего бита. Например, qCountLeadingZeroBits(quint16(1)) возвращает 15, а qCountLeadingZeroBits(quint16(8)) возвращает 12.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountLeadingZeroBits(quint32 v)
Возвращает количество последовательных нулевых битов в v, при поиске с старшего бита. Например, qCountLeadingZeroBits(quint32(1)) возвращает 31, а qCountLeadingZeroBits(quint32(8)) возвращает 28.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountLeadingZeroBits(quint64 v)
Возвращает количество последовательных нулевых битов в v, при поиске с старшего бита. Например, qCountLeadingZeroBits(quint64(1)) возвращает 63, а qCountLeadingZeroBits(quint64(8)) возвращает 60.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountTrailingZeroBits(quint8 v)
Возвращает количество последовательных нулевых битов в v, при поиске с младшего бита. Например, qCountTrailingZeroBits(1) возвращает 0, а qCountTrailingZeroBits(8) возвращает 3.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountTrailingZeroBits(quint16 v)
Это перегруженная функция.
Функция была добавлена в Qt 5.6.
[since 5.6] uint qCountTrailingZeroBits(quint32 v)
Это перегруженный функцией.
Эта функция была представлена в Qt 5.6.
[since 5.6] uint qCountTrailingZeroBits(quint64 v)
Это перегруженный функцией.
Эта функция была представлена в Qt 5.6.
template <typename ForwardIterator> void qDeleteAll(ForwardIterator begin, ForwardIterator end)
Удаляет все элементы в диапазоне [begin, end) с использованием оператора C++ delete. Тип элементов должен быть указателем (например, QWidget *).
Пример:
QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));
qDeleteAll(list.begin(), list.end());
list.clear(); Обратите внимание, что qDeleteAll() не удаляет элементы из контейнера; она просто вызывает delete для них. В примере выше мы вызываем clear() для контейнера, чтобы удалить элементы.
Эта функция также может использоваться для удаления элементов, хранящихся в ассоциативных контейнерах, таких как QMap и QHash. Только объекты, хранящиеся в каждом контейнере, будут удалены этой функцией; объекты, используемые в качестве ключей, не будут удалены.
См. также итераторы вперед.
template <typename Container> void qDeleteAll(const Container &c)
Это перегруженный функцией.
Это то же самое, что и qDeleteAll(c.begin(), c.end()).
[since 5.2] uint qPopulationCount(quint8 v)
Возвращает количество установленных битов в v. Это число также называется весом Хэмминга v.
Эта функция была представлена в Qt 5.2.
[since 5.2] uint qPopulationCount(quint16 v)
Это перегруженный функцией.
Эта функция была представлена в Qt 5.2.
[since 5.2] uint qPopulationCount(quint32 v)
Это перегруженный функцией.
Эта функция была представлена в Qt 5.2.
[since 5.2] uint qPopulationCount(quint64 v)
Это перегруженный функцией.
Эта функция была представлена в Qt 5.2.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtalgorithms.html