Пример: статическая Map
Пример: статическая 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().
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
27.1.1. Пример
27.1.1. Пример В главе 8 был представлен пример использования обычной разделяемой библиотеки. Библиотеку libhello.so, которую нам удалось создать, можно загружать во время выполнения. Программа loadhello загружает libhello.so динамически и вызывает функцию print_hello, которая находится в
Пример
Пример Программа в листинге 3.1 принимает полное имя в качестве аргумента командной строки, вызывает функции stat и ftok, затем выводит значения полей st_dev и st_ino структуры stat и получающийся ключ IPC. Эти три значения выводятся в шестнадцатеричном формате, поэтому легко видеть,
Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя
Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя #!/bin/bash# timeout.sh# Автор: Stephane Chazelas,# дополнен автором документа.INTERVAL=5 # предел времени ожиданияtimedout_read() { timeout=$1 varname=$2 old_tty_settings=`stty -g` stty -icanon min 0 time ${timeout}0 eval read $varname # или просто read $varname
Пример 10-27. Простой пример сравнения строк
Пример 10-27. Простой пример сравнения строк #!/bin/bash# match-string.sh: простое сравнение строкmatch_string (){ MATCH=0 NOMATCH=90 PARAMS=2 # Функция требует два входных аргумента. BAD_PARAMS=91 [ $# -eq $PARAMS ] || return $BAD_PARAMS case "$1" in "$2") return $MATCH;; * ) return $NOMATCH;; esac}a=oneb=twoc=threed=twomatch_string $a # неверное число
Пример 12-20. Пример форматирования списка файлов в каталоге
Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее
Пример 12-45. Пример работы с m4
Пример 12-45. Пример работы с m4 #!/bin/bash# m4.sh: Демонстрация некоторых возможносией макропроцессора m4# Строкиstring=abcdA01echo "len($string)" | m4 # 7echo "substr($string,4)" | m4 # A01echo "regexp($string,[0-1][0-1],&Z)" | m4 # 01Z# Арифметикаecho "incr(22)" | m4 # 23echo "eval(99 / 3)" | m4 #
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"
Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков" #!/bin/bashARGS=1 # Ожидаемое число аргументов.E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS# Если
Пример 25-8. Пример реализации алгоритма Решето Эратосфена
Пример 25-8. Пример реализации алгоритма Решето Эратосфена #!/bin/bash# sieve.sh# Решето Эратосфена# Очень старый алгоритм поиска простых чисел.# Этот сценарий выполняется во много раз медленнее# чем аналогичная программа на C.LOWER_LIMIT=1 # Начиная с 1.UPPER_LIMIT=1000 # До 1000.# (Вы можете
5.5.2 Статическая Память
5.5.2 Статическая Память Рассмотрим следующее:table tbl1(100);void f() (* static table tbl2(200); *)main() (*f(); *)Здесь конструктор table::table(), определенный в #5.3.1, будет вызываться дважды: один раз для tbl1 и один раз для tbl2. Деструктор table::~table() также будет вызван дважды: для уничтожения tbl1 и tbl2 после выхода
Статическая копия отчета
Статическая копия отчета По сути, это фотография отчета – файл с расширением. snp, который содержит копии каждой страницы отчета, сформированного в Access, двумерных графиков, чертежей и других элементов, включенных в отчет. Такой файл можно просматривать, печатать, посылать
Статическая типизация (static typing)
Статическая типизация (static typing) Когда в системе происходит вызов некоторого компонента определенным объектом, как узнать, что объект способен обработать вызов? (В терминологии сообщений: как узнать, что объект может обработать сообщение?) Чтобы гарантировать корректное
Статическая и динамическая типизация
Статическая и динамическая типизация Хотя возможны и промежуточные варианты, здесь представлены два главных подхода:[x]. Динамическая типизация: ждать момента выполнения каждого вызова и тогда принимать решение.[x]. Статическая типизация: с учетом набора правил
Статическая типизация: как и почему
Статическая типизация: как и почему Хотя преимущества статической типизации очевидны, неплохо поговорить о них еще