Широкое распространение этой функции делает переносимое использование переменной POSIX timezone
strftime() должно быть достаточно едва ли не для большинства необычных потребностей6.2. Функции сортировки и поиска
Сортировка и поиск являются двумя фундаментальными операциями, потребность в которых постоянно возникает во многих приложениях Библиотека С предоставляет ряд стандартных интерфейсов для осуществления этих задач.
Все процедуры разделяют общий лейтмотив; данные управляются через указатели void*
sort хорошо работает для текстовых файлов; см. справочную страницу для Поскольку ни один алгоритм не работает одинаково хорошо для всех приложений, имеются несколько различных наборов библиотечных процедур для сопровождения искомых коллекций данных. Данная глава рассматривает лишь один простой интерфейс для поиска. Другой, более развитый интерфейс описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев». Более того, мы намеренно не объясняем лежащие в основе алгоритмы, поскольку данная книга об API, а не об алгоритмах и структурах данных. Важно понять, что API можно рассматривать как «черные ящики», выполняющие определенную работу без необходимости понимания подробностей их работы.
6.2.1. Сортировка: qsort()
Сортировка выполняется с помощью qsort()
#include
void qsort(void *base, size_t nmemb, size_t size,
int (*compare)(const void*, const void*));
Название qsort()
qsort(). Реализация GLIBC использует высоко оптимизированную комбинацию Quicksort и Insertion Sort.)qsort()
void *base
Адрес начала массива.
size_t nmemb
Общее число элементов в массиве.
size_t size
Размер каждого элемента массива. Лучший способ получения этого значения — оператор С sizeof
int (*compare)(const void*, const void*)
Возможно устрашающее объявление
compare указывает на функцию, которая принимает два параметра 'const void*' и возвращает int».Большая часть работы заключается в написании соответствующей функции сравнения. Возвращаемое значение должно имитировать соответствующее значение strcmp()
double мы могли бы использовать эту функцию:int dcomp(const void *d1p, const void *d2p) {
const double *d1, *d2;
d1 = (const double*)d1p; /* Привести указатели к нужному типу */
d2 = (const double*)d2p;
if (*d1 < *d2) /* Сравнить и вернуть нужное значение */
return -1;
else if (*d1 > *d2)
return 1;
else if (*d1 == *d2)
return 0;
else
return -1; /* NaN сортируется до действительных чисел */
}
Это показывает общий стереотип для функций сравнения: привести тип аргументов от void*
Для чисел с плавающей точкой простое вычитание, подобное 'return *d1 - *d2
6.2.1.1. Пример: сортировка сотрудников
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT