Spec-Zone.ru › Qt 5.15

<QtAlgorithms> - Универсальные алгоритмы

В заголовке <QtAlgorithms> содержатся универсальные алгоритмы, основанные на шаблонах. Подробнее...

Заголовок: #include <QtAlgorithms>
  • Устаревшие члены

Функции

uint qCountLeadingZeroBits(quint32 v)
uint qCountLeadingZeroBits(quint8 v)
uint qCountLeadingZeroBits(quint16 v)
uint qCountLeadingZeroBits(quint64 v)
uint qCountTrailingZeroBits(quint8 v)
uint qCountTrailingZeroBits(quint32 v)
uint qCountTrailingZeroBits(quint16 v)
uint qCountTrailingZeroBits(quint64 v)
void qDeleteAll(ForwardIterator begin, ForwardIterator end)
void qDeleteAll(const Container &c)
uint qPopulationCount(quint8 v)
uint qPopulationCount(quint32 v)
uint qPopulationCount(quint16 v)
uint qPopulationCount(quint64 v)

Подробное описание

Qt предоставляет ряд глобальных шаблонных функций в <QtAlgorithms> для работы с контейнерами и выполнения небольших задач, упрощающих работу, таких как qDeleteAll(), которая вызывает operator delete для всех элементов в заданном контейнере или заданном диапазоне. Вы можете использовать эти алгоритмы с любым классом контейнера, предоставляющим итераторы в стиле STL, включая классы Qt QList, QLinkedList, QVector, QMap и QHash.

Большинство алгоритмов принимают итераторы в стиле STL в качестве параметров. Алгоритмы являются универсальными в том смысле, что они не привязаны к конкретному типу итератора; вы можете использовать их с любыми итераторами, удовлетворяющими определенным требованиям.

Различные алгоритмы могут иметь разные требования к итераторам, которые они принимают. Например, qFill() принимает два итератора типа forward. Требуемые типы итераторов указаны для каждого алгоритма. Если передается итератор неправильного типа (например, QList::ConstIterator передается как итератор типа output), вы всегда получите ошибку компилятора, хотя и не обязательно очень информативную.

Некоторые алгоритмы имеют особые требования к типу значения, хранимому в контейнерах. Например, qDeleteAll() требует, чтобы тип значения был типом указателя без const (например, QWidget *). Требования к типу значения указаны для каждого алгоритма, и компилятор выведет ошибку, если требование не выполнено.

Универсальные алгоритмы могут использоваться с другими классами контейнеров, помимо предоставленных Qt и STL. Синтаксис итераторов в стиле STL моделируется по образцу указателей C++, поэтому можно использовать обычные массивы в качестве контейнеров и обычные указатели в качестве итераторов. Общим приемом является использование qBinaryFind() вместе с двумя статическими массивами: одним, содержащим список ключей, и другим, содержащим список связанных значений. Например, следующий код ищет HTML-сущность (например, &amp;) в массиве name_table и возвращает соответствующее значение Unicode из массива value_table, если сущность распознана:

QChar resolveEntity(const QString &entity)
{
    static const QLatin1String name_table[] = {
        "AElig", "Aacute", ..., "zwnj"
    };
    static const ushort value_table[] = {
        0x0061, 0x00c1, ..., 0x200c
    };
    int N = sizeof(name_table) / sizeof(name_table[0]);

    const QLatin1String *name = qBinaryFind(name_table, name_table + N,
                                            entity);
    int index = name - name_table;
    if (index == N)
        return QChar();

    return QChar(value_table[index]);
}

Этот тип кода предназначен только для продвинутых пользователей; для большинства приложений подходят подход на основе QMap или QHash:

QChar resolveEntity(const QString &entity)
{
    static QMap<QString, int> entityMap;

    if (!entityMap) {
        entityMap.insert("AElig", 0x0061);
        entityMap.insert("Aacute", 0x00c1);
        ...
        entityMap.insert("zwnj", 0x200c);
    }
    return QChar(entityMap.value(entity));
}

Типы итераторов

Алгоритмы имеют определенные требования к типам итераторов, которые они принимают, и эти требования указаны индивидуально для каждой функции. Компилятор выведет ошибку, если требование не выполнено.

Итераторы типа input

Итератор типа input — это итератор, который можно использовать для последовательного чтения данных из контейнера. Он должен предоставлять следующие операторы: == и != для сравнения двух итераторов, унарный * для получения значения, хранящегося в элементе, и префиксный ++ для перехода к следующему элементу.

Типы итераторов контейнеров Qt (const и не const) являются итераторами типа input.

Итераторы типа output

Итератор типа output — это итератор, который можно использовать для последовательной записи данных в контейнер или в какой-либо выходной поток. Он должен предоставлять следующие операторы: унарный * для записи значения (т. е., *it = val) и префиксный ++ для перехода к следующему элементу.

Типы итераторов контейнеров Qt (не const) являются итераторами типа output.

Итераторы типа forward

Итератор типа forward — это итератор, который удовлетворяет требованиям как итераторов типа input, так и итераторов типа output.

Типы итераторов контейнеров Qt (не const) являются итераторами типа forward.

Итераторы типа bidirectional

Итератор типа bidirectional — это итератор, который удовлетворяет требованиям итераторов типа forward, но дополнительно поддерживает префиксный -- для итерации назад.

Типы итераторов контейнеров Qt (не const) являются итераторами типа bidirectional.

Итераторы типа random access

Последняя категория, итераторы типа random access, — это наиболее мощный тип итератора. Он поддерживает все требования итератора типа bidirectional и поддерживает следующие операции:

i += n перемещает итератор i на n позиций вперед
i -= n перемещает итератор i на n позиций назад
i + n or n + i возвращает итератор на элемент, расположенный на n позициях вперед от итератора i
i - n возвращает итератор на элемент, расположенный на n позициях назад от итератора i
i - j возвращает количество элементов между итераторами i и j
i[n] то же, что и *(i + n)
i < j возвращает true, если итератор j следует за итератором i

QList и QVector's итераторы (не const) являются итераторами типа random access.

Qt и алгоритмы STL

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

Рекомендации по переносу

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

  1. добавить директиву препроцессора #include <algorithm>;
  2. заменить функции Qt эквивалентными функциями STL в соответствии со следующей таблицей.
Функция Qt Функция STL
qBinaryFind std::binary_search или std::lower_bound
qCopy std::copy
qCopyBackward std::copy_backward
qEqual std::equal
qFill std::fill
qFind std::find
qCount std::count
qSort std::sort
qStableSort std::stable_sort
qLowerBound std::lower_bound
qUpperBound std::upper_bound
qLess std::less
qGreater std::greater

Единственные случаи, когда порт может не быть очевидным, связаны с тем, что старый код полагался на специализации шаблонов функций qLess() и/или qSwap(), которые использовались во внутренних реализациях функций алгоритмов Qt, но вместо этого игнорируются STL-функциями.

Если старый код полагался на специализацию функтора qLess(), то обходным путём является явное передача экземпляра класса qLess() в STL-функцию, например, так:

std::sort(container.begin(), container.end(), qLess<T>());

Вместо этого, поскольку невозможно передать пользовательский функтор для обмена в STL-функции, единственный способ обойти специализацию шаблона для qSwap() — предоставить ту же специализацию для std::swap().

См. также классы контейнеров и <QtGlobal>.

Документация функций

uint qCountLeadingZeroBits(quint32 v)

Возвращает количество последовательных нулевых битов в v при поиске с старшего значащего бита. Например, qCountLeadingZeroBits(quint32(1)) возвращает 31, а qCountLeadingZeroBits(quint32(8)) возвращает 28.

Эта функция была добавлена в Qt 5.6.

uint qCountLeadingZeroBits(quint8 v)

Возвращает количество последовательных нулевых битов в v при поиске с старшего значащего бита. Например, qCountLeadingZeroBits(quint8(1)) возвращает 7, а qCountLeadingZeroBits(quint8(8)) возвращает 4.

Эта функция была добавлена в Qt 5.6.

uint qCountLeadingZeroBits(quint16 v)

Возвращает количество последовательных нулевых битов в v при поиске с старшего значащего бита. Например, qCountLeadingZeroBits(quint16(1)) возвращает 15, а qCountLeadingZeroBits(quint16(8)) возвращает 12.

Эта функция была добавлена в Qt 5.6.

uint qCountLeadingZeroBits(quint64 v)

Возвращает количество последовательных нулевых битов в v при поиске с старшего значащего бита. Например, qCountLeadingZeroBits(quint64(1)) возвращает 63, а qCountLeadingZeroBits(quint64(8)) возвращает 60.

Эта функция была добавлена в Qt 5.6.

uint qCountTrailingZeroBits(quint8 v)

Возвращает количество последовательных нулевых битов в v при поиске с младшего значащего бита. Например, qCountTrailingZeroBits(1) возвращает 0, а qCountTrailingZeroBits(8) возвращает 3.

Эта функция была добавлена в Qt 5.6.

uint qCountTrailingZeroBits(quint32 v)

Это перегруженная функция.

Эта функция была добавлена в Qt 5.6.

uint qCountTrailingZeroBits(quint16 v)

Это перегруженная функция.

Эта функция была добавлена в Qt 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()).

uint qPopulationCount(quint8 v)

Возвращает количество установленных битов в v. Это число также называется весом Хэмминга v.

Эта функция была добавлена в Qt 5.2.

uint qPopulationCount(quint32 v)

Это перегруженная функция.

Эта функция была добавлена в Qt 5.2.

uint qPopulationCount(quint16 v)

Это перегруженная функция.

Эта функция была добавлена в Qt 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-5.15/qtalgorithms.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API