WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 5 | 6 || 8 | 9 |   ...   | 16 |

шаблон типа, иногда называются Активный участник процесса стандартизации параметрическими типами или языка C++ в рамках ANSI и ISO. Отмечен рядом международных наград, среди которых ACM генерическими объектами” [23]. С Grace Murray Hopper Award (1993 г.), входит в помощью шаблона, можно списки «12 лучших молодых ученых Америки» (1990 г., журнал Fortune) и «20 самых определить такие контейнерные выдающихся людей в компьютерной индустрии классы, как списки и ассоциативные за последние 20 лет» (1995 г., журнал Byte).

Доктор Страуструп в AT&T Bell Laboratories массивы и, не отказываясь от возглавляет департамент исследований в области промышленного программирования (Large-scale статического контроля типов, Programming Research).

http://www.research.att.com/~bs - 50 - УМП «Автоматизированные методы разработки архитектуры ПО» реализовать без потерь в эффективности выполнения программы.

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

Одним из самых полезных классов является контейнерный класс (такой класс, который хранит объекты каких-то других типов). Списки, массивы, ассоциативные массивы и множества - все это контейнерные классы. Контейнерные классы обладают тем свойством, что тип содержащихся в них объектов не имеет особого значения для создателя контейнера. Но для пользователя конкретного контейнера этот тип является важным. Таким образом, тип содержащихся объектов должен быть параметром контейнерного класса, и создатель такого класса будет определять его с помощью типа-параметра.

Исследования множества применений шаблонов при программировании на языке C++ привели к разработке различных библиотек стандартных шаблонов, часть из которых (прежле всего, STL) являются стандартами программирования и включены в компиляторы языка C++.

- 51 - УМП «Автоматизированные методы разработки архитектуры ПО» 4.1. Стандартная библиотека шаблонов STL “…Добро пожаловать в удивительный и безумный мир итераторов (iterators) — классов, предназначенных для перебора коллекций! Удивительный — поскольку итераторы просто решают многие проблемы проектирования.

Александр Александрович Степанов Безумный — поскольку Создатель STL.

два программиста C++ Родился 16 ноября 1950 г. в Москве.

ни за что не придут к С 1967 по 1972 изучал математику в Московском государственном университете. В 1973 получил диплом учителя общему мнению о том, математики в Московском областном педагогическом институте какие же идиомы им. Крупской (МОПИ).

должны использоваться C 1972 г. Александр работает в ИПУ РАН, ЦНИИКА.

В 1976 году у него появились идеи, связанные с обобщённым в реализации программированием, которые через 15 лет вылились в разработку итераторов…” библиотеки STL.

С 1977 г. работает в General Electric Research Center,. В это время он работал над языком программирования Tecton. В этой работе Джефф Элджер принимал участие Дэвид Мюссер (Dave Musser) — соратник во многих последующих проектах Александра.

(Jeff Alger)[24] С 1983 г. доцент (assistant professor) в Polytechnic University, Brooklyn NY. Результатом этого периода было создание, Создателем стандартной совместно с Дэвидом Мюссером и Ароном Кершенбаумом (Aaron библиотеки шаблонов STL Kershenbaum), большой библиотеки компонентов на Scheme (диалект Lisp).

является Александр В 1985 г. работает в GE Research и преподает курса высокоуровневого программирования. Получил грант GE Александрович Степанов Research (Information Systems Laboratory) для работы над (Alexander Stepanov).

реализацией идей обобщённого программирования в виде библиотеки алгоритмов на языке Ada.

В работе [25] приведены В 1987 г. работет в Bell Labaratories примеры использования В 1988 г. работает в HP Labs, и занимается системами хранения данных, дисковыми контроллерами.

библиотеки STL, в частности, В 1992 г. вернулся к работе над алгоритмами. В конце 1993 он для генеративного рассказал о своих идеях Энди Кёнигу (Andrew Koenig), который, высоко оценив их, организовал ему встречу с членами Комитета программирования кода с целью ANSI/ISO по стандарту C++ (ANSI/ISO C++ Standarts Committee).

исключения повторения В 1994 г. библиотека STL, разработанная Александром Степановым (при помощи Менг Ли (Meng Lee) стала частью одинаковых фрагментов официального стандарта языка C++.

В 1995 г. перешел в SGI.

программы с одними и теми же В 1999г. главный инженер подразделения серверов и алгоритмами, суперкомпьютеров SGI (CTO of Server and Supercomputer Business Unit).

предназначенными для В 2000 г. Александр Степанов перешёл в AT&T как вицеобработки разных типов данных.

президент и главный архитектор AT&T Laboratories (VP and Chief Architect).

Стандартная Библиотека В 2000 г. перешёл в Compaq как вице-президент и главный Шаблонов STL (Standard учёный.

C ноября 2002 работает в компании Adobe, где занимается в Template Library) представляет основном преподаванием программирования.

собой набор обобщённых, В 1995 получил премию Dr.Dobb’s Excellence In Programming Award за создание STL. Он разделил ее с Линусом Торвальдсом.

- 52 - УМП «Автоматизированные методы разработки архитектуры ПО» совместно работающих компонентов языка C++. Шаблонные алгоритмы STL работают как со структурами данных в библиотеке, так и с встроенными структурами данных языка C++.

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

Библиотека STL состоит из пяти основных видов компонентов:

o Алгоритм (Algorithm), который определяет вычислительную процедуру.

o Контейнер (Container), назначение которого управлять набором объектов в памяти.

o Итератор (Iterator), который обеспечивает средство доступа к содержимому контейнера для алгоритма.

o Функциональный объект (Function object), который инкапсулирует функцию в объекте для её использования другими компонентами.

o Адаптер (Adaptor), который настраивает компонент для обеспечения различного интерфейса.

Скотт Мейерс, в своей работе "Эффективное использование STL", определяет термингологию, применяемую в STL, следующим образом:

o ”… Контейнеры vector, string, deque и list относятся к категории стандартных последовательных контейнеров. К категории стандартных ассоциативных контейнеров относятся контейнеры set, multiset, map и multimap.

o Итераторы делятся на пять категорий в соответствии с поддерживаемыми операциями. Итераторы ввода обеспечивают доступ только для чтения и позволяют прочитать каждую позицию только один раз. Итераторы вывода обеспечивают доступ только для записи и позволяют записать данные в каждую позицию только один раз. Итераторы ввода и вывода построены по образцу операций чтения-записи в потоках вводавывода (например, в файлах), поэтому неудивительно, что самыми распространенными представителями итераторов ввода и вывода являются istream_iterator и ostream_iterator, соответственно.

Прямые итераторы обладают свойствами итераторов ввода и вывода, но они позволяют многократно производить чтение или запись в любой позиции. Оператор – ими не поддерживается, поэтому они позволяют производить передвижение только в прямом направлении с - 53 - УМП «Автоматизированные методы разработки архитектуры ПО» некоторой степенью эффективности. Все стандартные контейнеры STL поддерживают итераторы, превосходящие эту категорию итераторов по своим возможностям, но, при этом одна из архитектур хэшированных контейнеров основана на использовании прямых итераторов.

Контейнеры односвязных списков … также поддерживают прямые итераторы.

Двусторонние итераторы похожи на прямые итераторы, однако они позволяют перемещаться не только в прямом, но и в обратном направлении. Они поддерживаются всеми стандартными ассоциативными контейнерами, а также контейнером list.

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

o Любой класс, перегружающий оператор вызова функции (то есть operator ()), является классом функтора. Объекты, созданные на основе таких классов, называются объектами функций, или функторами. Как правило, в STL объекты функций могут свободно заменяться «обычными» функциями, поэтому под термином «объекты функций» часто объединяются как функции C++, так и функторы.

o Функции bindlst и bind2nd называются функциями привязки (binders)…” Определения Скотта Мейерса раскрывают архитектуру библиотеки STL, а также и способы её применения для выполнения практических разработок. Кстати, книга Скотта Майерса состоит из советов по практическому использованию STL, расположенных в определенной последовательности.

Тексты исходных кодов STL являются открытыми и будут частично воспроизводиться в настоящей работе.

Существует множество реализаций компонентов на базе STL, соответствующих стандарту, которые отличаются друг от друга индивидуальными свойствами. В некоторых источниках, как, например, в интересной статье Олега Ремизова [26], такие реализации называются коллекциями16 STL.

Разнообразие реализаций (коллекций) на базе STL может представлять определенную проблему для разработчиков архитектур с возможностью использования кода для его повторного применения.

Однако выполнение разработок в рамках стандарта STL минимизирует Коллекция это совокупность объектов, находящихся под управлением другого объекта.

- 54 - УМП «Автоматизированные методы разработки архитектуры ПО» риски неверного использования кода повторного применения на базе STL для разработки последующих проектов.

Стандартная библиотека STL содержит достаточное количество компонентов, необходимых для выполнения основных видов работ.

Следуя структурному описанию Олега Ремизова, перечислим некоторые из них:

vector – это множество элементов Т, сохраняемых в массиве, размер которого увеличивается по мере необходимости.

Ниже приведён исходный код контейнера vector17.

/* * * Copyright (c) * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty.

* * * Copyright (c) * Silicon Graphics Computer Systems, Inc.

* * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty.

*/ #ifndef SGI_STL_VECTOR_H #define SGI_STL_VECTOR_H #include #include #include #include #ifdef STL_USE_NAMESPACES using STD::vector;

#endif /* STL_USE_NAMESPACES */ #endif /* SGI_STL_VECTOR_H */ // Local Variables:

// mode:C++ // End:

Исходные тексты STL взяты из официального источника http://www.sgi.com/tech/stl/download.html и представляют собой авторский код, написанный Александром Степановым. Приведенный здесь код имеет статус Copyright (c) 1996 Silicon Graphics Computer Systems, Inc. и приведен в виде “как есть”.

- 55 - УМП «Автоматизированные методы разработки архитектуры ПО» Контейнер vector – чаще всего используемая компонента STL.

Внутренняя реализация этого контейнера авляется массивом и имеет счетчик элементов, сохраненных в этом массиве. Контейнер vector содержит инструкцию operator [], который позволяет пользоваться контейнером как обычным массивом. Такой же прием использования operator []также применен в контейнерах в map, deque, string и wstring.

Для использования контейнера vector необходима инструкция:

#include ;

list - множество элементов Т, сохраненных, как двунаправленный связанный список.

Ниже приведён исходный код контейнера list.

/* * * Copyright (c) * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty.

* * * Copyright (c) 1996, * Silicon Graphics Computer Systems, Inc.

* * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty.

*/ #ifndef SGI_STL_LIST_H #define SGI_STL_LIST_H #include #include #include #ifdef STL_USE_NAMESPACES using STD::list;

#endif /* STL_USE_NAMESPACES */ #endif /* SGI_STL_LIST_H */ // Local Variables:

// mode:C++ // End:

- 56 - УМП «Автоматизированные методы разработки архитектуры ПО» Для использования контейнера vector необходима инструкция:

#include ;

map – это множество элементов (коллекция), сохраняющая пары значений pair. Этот контейнер предназначен для быстрого поиска значения T по ключу const Key. В качестве ключа может быть использовано все, что угодно. Главной особенностью ключа является возможность применения к нему операции сравнения. Быстрый поиск значения по ключу осуществляется за счет отсортированных хранящихся пар. Как пишет Олег Ремизов, этот контейнер ”…имеет соответственно и недостаток – скорость вставки новой пары обратно пропорциональна количеству элементов, сохраненных в коллекции, поскольку просто добавить новое значение в конец коллекции не получится. Еще одна важная вещь, которую необходимо помнить при использовании данной коллекции – ключ должен быть уникальным...” Ниже приведён исходный код контейнера map.

/* * * Copyright (c) * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty.

* * * Copyright (c) 1996, * Silicon Graphics Computer Systems, Inc.

Pages:     | 1 |   ...   | 5 | 6 || 8 | 9 |   ...   | 16 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.