Spec-Zone.ru › Qt 5.12

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

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

  • Устаревшие члены

Функции

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

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

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

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

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

Универсальные алгоритмы могут использоваться с другими классами контейнеров, отличными от предоставляемых Qt и STL. Синтаксис итераторов в стиле STL смоделирован по C++-указателям, поэтому можно использовать обычные массивы в качестве контейнеров и обычные указатели в качестве итераторов. Распространенным приемом является использование qBinaryFind() совместно с двумя статическими массивами: одним, содержащим список ключей, и другим, содержащим список соответствующих значений. Например, следующий код найдёт HTML-сущность (например, &amp;) в массиве name_table и вернёт соответствующее значение Юникода из массива 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 (постоянные и непостоянные) — это все итераторы ввода.

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

Итератор вывода — это итератор, который может использоваться для последовательной записи данных в контейнер или в какой-либо поток вывода. Он должен предоставлять следующие операторы: унарный * для записи значения (т.е., *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 и QVector непостоянные типы итераторов являются итераторами произвольного доступа.

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>());

Вместо этого, поскольку невозможно передать пользовательский функтор swapper в функции 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(quint32 v)

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

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

uint qCountTrailingZeroBits(quint8 v)

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

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

uint qCountTrailingZeroBits(quint16 v)

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

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

uint qCountTrailingZeroBits(quint64 v)

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

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

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. Только объекты, хранящиеся в каждом контейнере, будут удалены этой функцией; объекты, используемые в качестве ключей, не будут удалены.

См. также итераторы forward.

void qDeleteAll(const Container &c)

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

Это то же самое, что и qDeleteAll(c.begin(), c.end()).

uint qPopulationCount(quint32 v)

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

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

uint qPopulationCount(quint8 v)

Возвращает количество установленных битов в v. Это число также называется весом Хэмминга 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.12/qtalgorithms.html

Spec-Zone.ru

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