Базовые алгоритмы Qt4 (Qt 4`s Generic Algorithms) | страница 2



>j = qUpperBound(list.begin(), list.end(), value);

>while (i != j) {

> processItem(*i);

> ++i;

>}

Пример: статическая Map

В этой секции, мы будем использовать бинарный поиск, для реализации "static const" map. Структура данных полностью хранится в памяти и состоит из пары "фамилия, имя", которые отсортированы по фамилии. По сравнению с использованием QMap или QHash, этот подход экономит память и имеет смысл в высоко оптимизированных приложениях или библиотеках.

Сначала, мы определяем структуру для имен, а так же операторы сравнения для поиска вхождения фамилий:

>struct Entry {

> const char *familyName;

> const char *givenName;

>};

>bool operator<(const Entry &entry, const QString &family)

>{

> return entry.familyName < family;

>}

>bool operator<(const QString &family, const Entry &entry)

>{

> return family < entry.familyName;

>}

Затем объявляем наши данные:

>static const int NumEntries = 4;

>static const Entry entries[NumEntries] = {

> { "Deitel", "Harvey" },

> { "Deitel", "Paul" },

> { "Jobs", "Steve" },

> { "Torvalds", "Linus" }

>};

>static const Entry * const end = entries + NumEntries;

Указатель end отмечает конец массива.

>bool contains(const QString &family)

>{

> return qBinaryFind(entries, end, family) != end;

>}

Теперь, когда все на месте, реализация contains() тривиальна. Так как C++ указатели отвечают критериям STL итераторов произвольного доступа, мы можем использовать их в связке с qBinaryFind().

>QString givenName(const QString &family)

>{

> const Entry *i = qBinaryFind(entries, end, family);

> if (i == end)

> return "";

> return i->givenName;

>}

Функция givenName() возвращает имя человека с данной фамилией. Например, если мы передаем в качестве аргумента "Torvalds", мы получаем "Linus"; если мы передаем "Deitel", функция возвращает "Harvey" или "Paul".

>QStringList givenNames(const QString &family)

>{

> const Entry *i = qLowerBound(entries, end, family);

> const Entry *j = qUpperBound(entries, end, family);

> QStringList result;

> while (i != j)

> result += (i++)->givenName + (" " + family);

> return result;

>}

Функция givenNames() возвращает список людей, принадлежащих определенной семье. Здесь показано использование qLowerBound() и qUpperBound().