Структура библиотеки
Структура библиотеки
Библиотека содержит пять основных видов компонентов:
- алгоритм (algorithm): определяет вычислительную процедуру.
- контейнер (container): управляет набором объектов в памяти.
- итератор (iterator): обеспечивает для алгоритма средство доступа к содержимому контейнера.
- функциональный объект (function object): инкапсулирует функцию в объекте для использования другими компонентами.
- адаптер (adaptor): адаптирует компонент для обеспечения различного интерфейса.
Такое разделение позволяет нам уменьшить количество компонентов. Например, вместо написания функции поиска элемента для каждого вида контейнера мы обеспечиваем единственную версию, которая работает с каждым из них, пока удовлетворяется основной набор требований.
Следующее описание разъясняет структуру библиотеки. Если программные компоненты сведены в таблицу как трёхмерный массив, где одно измерение представляет различные типы данных (например, int, double), второе измерение представляет различные контейнеры (например, вектор, связный список, файл), а третье измерение представляет различные алгоритмы с контейнерами (например, поиск, сортировка, перемещение по кругу), если i, j и k - размеры измерений, тогда должно быть разработано i* j *k различных версий кода. При использовании шаблонных функций, которые берут параметрами типы данных, нам нужно только j * k версий. Далее, если заставим наши алгоритмы работать с различными контейнерами, то нам нужно просто j+k версий. Это значительно упрощает разработку программ, а также позволяет очень гибким способом использовать компоненты в библиотеке вместе с определяемыми пользователем компонентами. Пользователь может легко определить специализированный контейнерный класс и использовать для него библиотечную функцию сортировки. Для сортировки пользователь может выбрать какую-то другую функцию сравнения либо через обычный указатель на сравнивающую функцию, либо через функциональный объект (объект, для которого определён operator()), который сравнивает. Если пользователю необходимо выполнить передвижение через контейнер в обратном направлении, то используется адаптер reverse_iterator.
Библиотека расширяет основные средства C++ последовательным способом, так что программисту на C/C++ легко начать пользоваться библиотекой. Например, библиотека содержит шаблонную функцию merge (слияние). Когда пользователю нужно два массива a и b объединить в с, то это может быть выполнено так:
int a[1000];
int b[2000];
int c[3000];
…
merge(a, a+1000, b, b+2000, c);
Когда пользователь хочет объединить вектор и список (оба - шаблонные классы в библиотеке) и поместить результат в заново распределённую неинициализированную память, то это может быть выполнено так:
vector‹Employee› a;
list‹Employee› b;
…
Employee* с = allocate(a.size() + b.size(), (Employee*)0);
merge(a.begin(), a.end(), b.begin(), b.end(), raw_storage_iterator‹Employee*, Employee›(c));
где begin() и end() - функции-члены контейнеров, которые возвращают правильные типы итераторов или указателе-подобных объектов, позволяющие merge выполнить задание, а raw_storage_iterator - адаптер, который позволяет алгоритмам помещать результаты непосредственно в неинициализированную память, вызывая соответствующий конструктор копирования.
Во многих случаях полезно перемещаться через потоки ввода-вывода таким же образом, как через обычные структуры данных. Например, если мы хотим объединить две структуры данных и затем сохранить их в файле, было бы хорошо избежать создания вспомогательной структуры данных для хранения результата, а поместить результат непосредственно в соответствующий файл. Библиотека обеспечивает и istream_iterator, и ostream_iterator шаблонные классы, чтобы многие из библиотечных алгоритмов могли работать с потоками ввода-вывода, которые представляют однородные блоки данных. Далее приводится программа, которая читает файл, состоящий из целых чисел, из стандартного ввода, удаляя все числа, делящиеся на параметр команды, и записывает результат в стандартный вывод:
main(int argc, char** argv) {
if (argc!= 2) throw("usage: remove_if_divides integer ");
remove_copy_if(istream_iterator‹int›(cin), istream_iterator‹int›(), ostream_iterator‹int›(cout, " "), not1(bind2nd(modulus‹int›(), atoi(argv[1]))));
}
Вся работа выполняется алгоритмом remove_copy_if, который читает целые числа одно за другим, пока итератор ввода не становится равным end-of-stream (конец-потока) итератору, который создаётся конструктором без параметров. (Вообще все алгоритмы работают способом "отсюда досюда", используя два итератора, которые показывают начало и конец ввода.) Потом remove_copy_if записывает целые числа, которые выдерживают проверку, в выходной поток через итератор вывода, который связан с cout. В качестве предиката remove_copy_if использует функциональный объект, созданный из функционального объекта modulus‹int›, который берёт i и j и возвращает i % j как бинарный предикат, и превращает в унарный предикат, используя bind2nd, чтобы связать второй параметр с параметром командной строки atoi(argv[1]). Потом отрицание этого унарного предиката получается с помощью адаптера функции not1.
Несколько более реалистичный пример - фильтрующая программа, которая берёт файл и беспорядочно перетасовывает его строки.
main(int argc, char**) {
if (argc!= 1) throw("usage: shuffle ");
vector‹string› v;
copy(istream_iterator‹string›(cin), istream_iterator‹string›(), inserter(v, v.end()));
random_shuffle(v.begin(), v.end());
copy(v.begin(), v.end(), ostream_iterator‹string›(cout));
}
В этом примере copy перемещает строки из стандартного ввода в вектор, но так как вектор предварительно не размещён в памяти, используется итератор вставки, чтобы вставить в вектор строки одну за другой. (Эта методика позволяет всем функциям копирования работать в обычном режиме замены также, как в режиме вставки.) Потом random_shuffle перетасовывает вектор, а другой вызов copy копирует его в поток cout.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
8.1. Статические библиотеки
8.1. Статические библиотеки Статические библиотеки представляют собой простые коллекции объектных файлов, объединенных утилитой ar (архиватор), ar группирует объектные файлы в один архив и добавляет таблицу, в которой указано, какие объектные файлы в архиве какие символы
8.3.2. Несовместимые библиотеки
8.3.2. Несовместимые библиотеки Если новая версия библиотеки не должна быть совместимой с предшествующими ее версиями, ей потребуется присвоить другое имя soname. Например, для выпуска новой версии библиотеки С, не совместимой со старой версией, разработчики использовали soname
Библиотеки
Библиотеки В OS/400 библиотека — объект, который используется для поиска других объектов в базе данных. В отличие от многоуровневой иерархии каталогов в ОС ПК и Unix, библиотека OS/400 имеет одноуровневую иерархию. Для иллюстрации рассмотрим структуру имен объектов OS/400.Чтобы
Библиотеки
Библиотеки Библиотеки являются новинкой для операционных систем Windows. Библиотеки упрощают поиск, упорядочивание файлов, распределенных на компьютере или в сети. Библиотека объединяет содержимое в одном месте независимо от того, где оно фактически хранится. В левой
Библиотеки
Библиотеки Польза следующего нововведения явно очевидна. В Windows 7 существуют специальные папки Документы, Изображения, Музыка и Видео, с которыми пользователи работают достаточно часто. Если раньше, в Windows Vista или Windows ХР, каждая подобная папка ссылалась на одну реальную
Библиотеки
Библиотеки Библиотеки — это специальные файлы с расширением DLL, описывающие все функции, применяемые программой, для которой данная библиотека написана.Именно библиотеки содержат большинство функций, используемых операционной системой или программой. При этом
Бесплатные библиотеки
Бесплатные библиотеки Перечисленные выше библиотеки и приложения – это далеко не все, с помощью чего система КОМПАС-3D облегчает жизнь инженеру. Есть еще много других утилит, которые входят в стандартную поставку или распространяются отдельно и предназначены для
Электронные библиотеки
Электронные библиотеки Даже во времена Интернета книга остается ценным источником знаний. Хоть на планете уже нет «самой читающей страны в мире», тем не менее книги еще не утратили своей актуальности. Тем более если речь идет о новом их воплощении – электронных книгах, в
4.4. Библиотеки
4.4. Библиотеки Одним из последствий того влияния, которое стиль Unix-программирования оказал на модульность и четко определенные API-интерфейсы, является устойчивая тенденция к разложению программ на фрагменты связующего уровня, объединяющего семейства библиотек,
4.4. Библиотеки
4.4. Библиотеки Одним из последствий того влияния, которое стиль Unix-программирования оказал на модульность и четко определенные API-интерфейсы, является устойчивая тенденция к разложению программ на фрагменты связующего уровня, объединяющего семейства библиотек,
Классы библиотеки MFC
Классы библиотеки MFC Библиотека классов MFC содержит большое количество разнообразных классов. Так MFC версии 4.0 включает немного меньше 200 классов. Каждый класс, как правило, содержит от нескольких единиц до нескольких десятков различных методов и элементов данных. Конечно
Библиотеки dll
Библиотеки dll Библиотеки dll (dynamically linked libraries):* содержат группу взаимосвязанных подпрограмм* находятся в откомпилированном файле* предназначены для обращения к ним из различных программОни находятся в файле с расширением .dll либо в текущем каталоге приложения (локальные),
Часть 4: США и библиотеки
Часть 4: США и библиотеки Как мы увидели в предыдущих статьях, авторское право было придумано не в США. Отцы-основатели принесли его с собой на новую родину. Тем не менее, монополию на идеи приветствовали далеко не все. Томас Джефферсон писал: Если природа создала что-то
1.5. Библиотеки
1.5. Библиотеки Впервые библиотеки (виртуальные папки) появились еще в Windows Vista Beta 1, но почему-то эту функцию не включили в состав релиза Vista. В Windows 7 данная функция появилась вновь. Виртуальная папка (библиотека) объединяет несколько обычных папок, возможно, расположенных на
Библиотеки
Библиотеки Один из характерных аспектов разработки ПО ОО-способом - возможность создавать его на основе существующих библиотек. ОО-среда должна обеспечивать хорошие библиотеки и механизмы создания новых
Библиотеки и библиотеки
Библиотеки и библиотеки Известно, что большие собрания пополняются за счет малых. Небезынтересно узнать — на каких условиях? Наверняка ведь считается неэтичным просто скачать текст у другого библиотекаря и выложить в своей библиотеке. А как они это делают?Известно, что