1.10 Упражнения |
Предыдущая Содержание Следующая |
Если объект может принадлежать нескольким наборам одновременно, необходимо другое представление для наборов. Если мы по-прежнему представляем объекты как небольшие уникальные целочисленные значения, и если есть предел на количество объектов, можно представить набор в виде битового массива, сохранённого в длинную строку символов, где выбранный значением объекта бит установлен или очищен в зависимости от наличия объекта в наборе. Более универсальное и более традиционное решение представляет набор как линейный список узлов, хранящих адреса объектов в наборе. Это не накладывает никаких ограничений на объекты и позволяет реализовать набор, не зная представление объекта. Для отладки иметь возможность посмотреть на отдельные объекты очень полезно. Разумное универсальное решение представляет собой две функции
int store (const void * object, FILE * fp); int storev (const void * object, va_list ap);
store() записывает описание объекта в файл. storev() для получения указателя на файл из списка аргументов, на который указывает ap, использует va_arg(). Обе функции возвращают количество записанных символов. storev() станет удобной, если мы реализуем для наборов следующую функцию:
int apply (const void * set, int (* action) (void * object, va_list ap), ...);
apply() вызывает action() для каждого элемента в наборе и передаёт остальную часть списка аргументов. action() не должна изменять набор, однако она может вернуть ноль, чтобы остановить работу apply() раньше. apply() возвращает истину, если были обработаны все элементы. |
Предыдущая Содержание Следующая |