Spec-Zone.ru › Qt 6.0

<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, QMap и QHash.

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

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

Некоторые алгоритмы имеют особые требования к типу значения, хранящегося в контейнерах. Например, 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));
}

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

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

Итераторы ввода

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

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

Итераторы вывода

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

Не-const типы итераторов контейнеров Qt являются итераторами вывода.

Итераторы прямого доступа

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

Не-const типы итераторов контейнеров Qt являются итераторами прямого доступа.

Итераторы двустороннего доступа

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

Не-const типы итераторов контейнеров 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 не-const тип итератора — итератор произвольного доступа.

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

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

[since 5.6] uint qCountLeadingZeroBits(quint32 v)

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

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

[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(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(quint32 v)

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

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

[since 5.6] uint qCountTrailingZeroBits(quint16 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(quint32 v)

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

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

[since 5.2] uint qPopulationCount(quint16 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.0/qtalgorithms.html

Spec-Zone.ru

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