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

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

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

Жанр: Программирование
Серии: -
Всего страниц: 1
ISBN: -
Год издания: Не установлен
Формат: Полный

Базовые алгоритмы Qt4 (Qt 4`s Generic Algorithms) читать онлайн бесплатно

Шрифт
Интервал

Qt предоставляет ряд алгоритмов на основе шаблона, которые реализуют самые полезные алгоритмы STL, начиная с версии 2. В этой статье, мы рассмотрим некоторые из алгоритмов, предлагаемых в Qt 4 .


Qt предоставляет собственные алгоритмы потому, что некоторые платформы (например, embedded Linux) не предоставляет реализацию STL. Алгоритмы используются внутри Qt и доступны его пользователям.

Возможно смешивание реализаций STL и Qt контейнеров и алгоритмов. Например, вы можете использовать алгоритм std::find() для QList, или qSort() для std::vector. Это работает потому, что алгоритмы основаны на итераторах STL-стиля, и итераторы контейнеров классов Qt отвечают требованиям STL.

Два вида сортировки

Алгоритмы qSort() и qStableSort()могут быть использованы при сортировке элементов QList, QVector или в любом динамическом C++ массиве. С Qt 4, также возможно определить любой оператор сравнения (вместо operator<()).

Stable сортировка имеет свойство сохранения порядка похожих элементов при сортировке. Это полезно, когда имеешь дело с элементами, которые сравниваются между собой, даже если они не полностью эквивалентны. Например, если сортируется список адресов по фамилии, можно использовать qStableSort (), чтобы сохранить начальный порядок людей с одинаковой фамилией. Обычная сортировка не гарантирует этого.

Линейный и бинарный поиск

Алгоритмы qFind() и qBinaryFind() в качестве параметров получают итераторы диапазона и значение, а возвращают итератор на элемент, который соответствует данному значению, или "end" итератор, если не найдено ни одного элемента. Алгоритм бинарного поиска намного быстрее чем линейный алгоритм, но он может работать только с сортированными диапазонами.

Если значение встречается более одного раза, qFind() вернет итератор на первый элемент, тогда как qBinaryFind() на произвольный.

Для большей гибкости, Qt 4 предоставляет qLowerBound() и qUpperBound(). Как и qBinaryFind(), они работают с сортированным диапазоном. Если значение найдено, qLowerBound() вернет итератор на первый найденный элемент, а qUpperBound() вернет итератор, указывающий на следующий за последним элемент. Если значение не найдено, они вернут итератор на позицию, в которую данный элемент может быть вставлен.

Частый пример использования qLowerBound() и qUpperBound() это проход по всем вхождениям значения:

>QStringList list;

>QStringList::iterator i, j;

>...

>i = qLowerBound(list.begin(), list.end(), value);

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


Рекомендуем почитать
Мастера государственной измены

Масонство — тайное преступное сообщество, преследующее цель достижения мирового господства на началах иу-даистского учения об избранном народе. В книге на основе секретных масонских документов, хранившихся в Особом Архиве КГБ СССР, раскрывается подлинная история масонских преступлений против России с момента возникновения, в начале XVIII века, до конца XIX века. Многие документы публикуются впервые и имеют воистину сенсационный характер.Книга снабжена уникальным словарем российских масонов.


Великая танковая война, 1939–1945

1 сентября 1939 года, сбив пограничные шлагбаумы, немецкие танки вступили на территорию Польши — началась Вторая мировая война. Историки не зря окрестили её «войной моторов» — механизированные части и авиация играли в ней определяющую роль. И всё-таки по сути и влиянию на исход боевых действий, если сравнить вклад в победу различных родов войск, — мировой пожар 1939–1945 гг. был в первую очередь ВЕЛИКОЙ ТАНКОВОЙ ВОЙНОЙ.Подробное описание основных танковых сражений, глубокий анализ стратегии и тактики танковых войск, особенности боевого применения бронетехники на всех фронтах Второй мировой, свежий взгляд на теорию и практику танковой войны — в новой книге ведущего специалиста по истории бронетехники, автора военно-исторических бестселлеров, разошедшихся тиражами более 200 000 экземпляров!


Чердак в паутине

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


Анклав

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


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.