Новинки компьютерных книг ->> Стандартная библиотека C++ на примерах
Стандартная библиотека C++ на примерахПабло Халперн
Вступительное словоОбратите внимание на книги серии На примерах Джесса Либерти (Jesse Liberty). Я занялся созданием этой серии книг, поскольку был убежден, что традиционные учебные пособия по программированию подходят далеко не всем. Как правило, они начинаются с изучения ряда стандартных прикладных приемов, представленных в определенной логической последовательности, а затем автор книги переходит к рассказу о практическом применении этих приемов. Этот традиционный подход обучения годится для большинства людей, но не для всех. За свою практику я обучил основам программирования, наверное, около 10 000 человек, при этом мне приходилось работать как индивидуально, так и с большими группами, а также проводить занятия по Internet. Мне приходилось слышать от многих моих слушателей, что для них было бы предпочтительнее изучать не абстрактные приемы программирования, а просто сесть вместе с преподавателем у компьютера и начать с создания реального проекта, усваивая необходимые навыки по мере продвижения работы над реальной программой. Именно эта идея легла в основу книг серии На примерах. В каждой из этих книг профессиональные программисты создают вместе с вами реальный сложный программный продукт. Вы начинаете работу с "чистого листа" и проходите через все этапы конструирования и выполнения модулей программы. Книги серии На примерах могут быть исходной точкой знакомства с новой для вас темой, хотя их можно использовать и для того, чтобы закрепить материал, полученный раньше из традиционных пособий по программированию. Трудно сказать, какой подход лучше. Это зависит исключительно от особенностей вашего восприятия новой темы. В основу всех книг серии На примерах положен ряд некоторых общих принципов. В частности, мы всегда исходим из того, что вы абсолютно ничего не знали по данной теме до того, как купили эту книгу. Несмотря на то что я не принимал непосредственного участия в написании всех книг данной серии, как ответственный редактор этой серии, я несу полную ответственность за каждую из них. Дополнительные материалы по каждой книге и тематически связанные с ними телеконференции вы найдете на моей Web-странице (www.libertyassociates.com). Если у вас возникнут какие-либо вопросы или предложения, напишите мне по адресу jliberty@libertyassociates.com. Огромное вам спасибо за выбор книг этой серии. Джесс Либерти (Jesse Liberty), ответственный редактор серии книг На примерах. Об автореПабло Халперн (Pablo Halpern) работает в индустрии компьютерных программ уже более 17 лет и является крупным специалистом в программировании на С и С++. Как главный консультант компании Halpern-Wight Software Inc., он работал со многими корпорациями и частными компаниями, которые обращались за помощью в разработке проектов и обучении персонала программированию на С++ и объектно-ориентированному анализу. Пабло был автором курса, обучающего работе со стандартной библиотекой С++, и принимал участие в разработке ряда других курсов по углубленному изучению программирования на С++. Пабло живет вместе с женой Ненси и дочерью Джулией в индустриальном центре штата Массачусетс недалеко от Бостона и Кембриджа. Вы можете связаться с ним по электронной почте: phalpern@newview.org. ВступлениеЧто особенного в этой книгеЭта книга отличается от всех других книг, когда-либо написанных по данной теме. И вот в чем состоит отличие: все другие книги по программированию начинаются с изучения основных приемов программирования в порядке возрастания их сложности. После изучения всех этих приемов авторы переходят к демонстрации их применения, т.е. к созданию простейших программ. Данная книга начинается не со списка классов и функций, а с создания нового проекта. После анализа проблем и конструирования структуры программы мы перейдем к методам реализации ваших идей. Знакомство с основными средствами стандартной библиотеки С++ происходит по мере их использования для решения конкретных задач. Сначала вы научитесь планировать проект, а потом освоите средства реализации поставленных задач. В изучении стандартной библиотеки С++ нет ничего сложногоНа многих людей само название "стандартная библиотека С++" действует устрашающе. Я думаю, что проблема связана с тем, что в большинстве случаев изучение стандартной библиотеки начинается с рассмотрения ее многочисленных компонентов, а не с сосредоточения на проблемах, для решения которых она создавалась. Стандартная библиотека С++ настолько огромна, что пытаться изучить ее по списку компонентов - равносильно попытке выучить французский язык, зазубривая орфографический словарь. Есть два способа изучения иностранного языка. Один состоит в том, чтобы выучить некоторый набор слов и правила спряжения глаголов. Другой путь состоит в том, чтобы поехать на некоторое время в эту страну и освоить ее язык в живом общении с людьми. Каждый волен выбирать свой метод, но что касается меня, то за неделю, проведенную во Франции, я продвинулся в изучении французского дальше, чем за несколько лет изучения его по учебникам. Если бы вы пришли ко мне на занятия с целью научиться программированию в С++, то я бы не дал вообще никаких учебников. Мы бы просто сели у компьютера и стали вместе писать программу. И по ходу работы над программой я бы учил вас всему необходимому на конкретных примерах, лишь время от времени давая читать выдержки из учебников для закрепления материала в памяти. Именно в этом стиле написана данная книга. Мы вместе с вами займемся созданием реальной программы, и в ходе работы вы освоите все, что вам необходимо. С самых первых страниц вы сосредоточитесь на анализе проблем и моделировании программы, с помощью которой эти проблемы будут решаться, вместо того чтобы изучать абстрактные классы и методы. Научитесь выбирать наиболее подходящие средства программированияЕще один недостаток традиционного подхода обучения программированию состоит в том, что при ошеломляющем множестве средств и подходов мало внимания уделяется тому, как выбрать наиболее подходящее средство для решения конкретной задачи. Поскольку мы с вами собираемся работать над созданием реальной программы, я смогу продемонстрировать альтернативные пути решения возникающих проблем и объяснить, почему выбор того или иного средства в данном случае предпочтительнее. Возвращаясь к аналогии с изучением иностранного языка, можно сказать, что вы изучите не только стандартные словарные фразы, но и идиоматические выражения, что сделает ваш язык богаче и образнее. Под идиоматическим использованием языка программирования следует понимать использование цельных конструкций, направленных на решение конкретных проблем, без детального анализа отдельных частей. Использование идиоматических конструкций позволяет вам быстро находить общие решения и облегчает понимание программного кода другими людьми, кто знаком с этими идиомами. Для чего нужна стандартная библиотека С++Стандарты языка С++ описываются в документе, состоящем из 776 страниц (ISO/IEC 14882, 1998). Примерно половина этого документа посвящена описанию библиотеки функций и классов, которые поставляются вместе со стандартным компилятором языка С++. Поэтому, если вы не знакомы со стандартной библиотекой С++, то половину его возможностей вы не знаете. Если вы еще не знакомы с программированием на С++, отложите эту книгу в сторону и идите в тот магазин, где вы ее купили. Там вы наверняка найдете книгу, посвященную основам программирования на C++. Прочтите сначала ее, а потом сразу возвращайтесь к следующему абзацу данной книги. Большая часть программного кода отводится выполнению многочисленных рутинных задач, таких как управление коллекцией объектов, манипулирование текстовыми строками, сортировка данных и форматирование ввода и вывода. Большинство этих задач приходится выполнять в любой программе, причем написание программных кодов для их выполнения достаточно сложно и утомительно. Представьте, что вам каждый раз приходится по-новому создавать алгоритм сортировки данных. Достаточно велика вероятность допустить какую-нибудь незначительную ошибку, которая проявится только при определенных условиях, например при сортировке массива, содержащего три одинаковых значения. Нет сомнений, что эта ошибка обнаружится в самый неподходящий момент. Умелое использование стандартной библиотеки гарантирует выполняемость создаваемых программ при использовании разных компиляторов и операционных систем. Использование стандартных классов позволяет легко наладить обмен данными между программами, тем более, что в последнее время независимые создатели программных библиотек все чаще используют в интерфейсах классы из стандартной библиотеки С++. Научившись работать со стандартной библиотекой С++, вы будете избавлены от необходимости изобретать колесо. Средства стандартной библиотеки призваны упростить вашу работу над проектом и повысить надежность создаваемых программных продуктов. Программисты, которым придется в будущем использовать ваши программные модули в своих проектах, будут безмерно благодарны вам, что им приходится работать с понятными стандартными функциями, а не разбираться в авторских хитросплетениях. (Даже если они не скажут вам спасибо за это, то, по крайней мере, вам не будет икаться от их мыслей в ваш адрес.) Что представляет собой стандартная библиотека С++Стандартная библиотека С++ призвана выполнять две основные задачи. Прежде всего - это набор стандартных типов данных и функций, готовых к употреблению в любом компиляторе, который отвечает требованиям международных стандартов языка С++. Библиотекой называется набор программных компонентов многоразового использования (классы, функции, макросы и т.д.), который создается для облегчения выполнения стандартных, наиболее общих задач программирования. Существуют специализированные библиотеки (например, программирование для Internet) и библиотеки общего назначения (сортировка данных, сохранение файлов и т.д.). Стандартной называется библиотека, состав, назначение и принципы использования которой определяются утвержденной документацией, например стандартами Международной организации стандартизации (ISO - International Standards Organization). Ниже речь пойдет о стандартной библиотеке С++, свойства которой описаны в специальном документе ISO. Мы будем называть ее просто стандартной библиотекой. О компиляторе говорят, что он отвечает стандартам, если он и его встроенные библиотеки функционируют в соответствии с международными стандартами ISO для языка программирования С++. В то же время стандартная библиотека С++ представляет собой среду разработки для создания и сохранения новых библиотечных компонентов. В большинстве случаев работа со стандартной библиотекой не подразумевает создание новых компонентов. Но если для вашего проекта необходимы новые уникальные программные модули, то в стандартной библиотеке вы найдете мощные встроенные средства программирования. Умение создавать и использовать новые библиотечные компоненты как раз и отличает профессионала от новичка в программировании. Я надеюсь, что, прочитав эту книгу и ближе познакомившись с возможностями стандартной библиотеки С++, вы значительно продвинетесь на пути от новичка к профессионалу. Части стандартной библиотеки Стандартная библиотека С++ в действительности состоит из десяти небольших библиотек.
Что нам будет необходимо в работе К некоторым из описанных выше десяти библиотек вам придется обращаться практически каждый день, другие, возможно, вам никогда не понадобятся. В этой книге основное внимание будет сосредоточено на рассмотрении пяти библиотек, которые, с моей точки зрения, являются наиболее важными. Это библиотеки строк, контейнеров, итераторов, алгоритмов и ввода-вывода. Нельзя сказать, что стандартная библиотека С++ совершенна и содержит все необходимое для разработки любого проекта. Специальному комитету при ISO, ответственному за разработку и поддержание стандартов языка С++, приходится ежегодно рассматривать сотни предложений от программистов всего мира о том, какие дополнительные средства следовало бы включить в стандартный набор. После тщательного рассмотрения некоторые из предложенных средств, которые представляют интерес для пользователей и не противоречат базовым концепциям языка С++, ежегодно добавляются в стандартную библиотеку. В то же время, если проследить историю развития и становления языка С++, то следует признать, что некоторые довольно перспективные средства общего пользования были отклонены комитетом, а некоторые добавленные средства чрезмерно специфичны, чтобы стать популярными среди широкого круга пользователей. Позже я обращу ваше внимание на некоторые наиболее существенные промахи. Кроме того, при рассмотрении стандартной библиотеки мы пропустим некоторые средства, назначение которых либо слишком специфично, либо не вполне понятно. Отбирая средства программирования по значимости, я совершенно не хочу обидеть членов комитета ISO и отдаю должное их адскому труду над стандартами языка С++. В то же время многолетний опыт практического программирования позволяет мне высказать свое мнение по поводу тех или иных библиотечных средств. О наследстве стандартных библиотечных функций, оставшемся от языка С Если вам приходилось программировать на языке С, то вы, безусловно, знакомы с библиотечными функциями стандартной библиотеки С. Такие функции, как printf, strcpy, atoi и прочие, по-прежнему доступны в языке С++, и позже мы рассмотрим их использование. Некоторые части библиотеки С, такие как функции ввода-вывода, редко используются в С++, поскольку современная стандартная библиотека предлагает более совершенные и удобные средства ввода-вывода. В то же время некоторые другие средства, перешедшие в С++ из языка С, по-прежнему пользуются популярностью у программистов. Компоненты стандартной библиотеки С претерпели некоторые изменения, прежде чем были включены в библиотеку С++. Были изменены имена файлов заголовков, например файл stdio.h был заменен на cstdio. При смене имен других файлов соблюдался тот же принцип: расширение .h удалялось, а в начале имени добавлялась буква c в нижнем регистре. Благодаря новым возможностям перегрузки имен функций в С++ некоторые функции языка С были изменены для облегчения применения ключевого слова const. Например, функция языка С char* strchr(const char* s, char c); была заменена в С++ следующими двумя перегруженными функциями: const char* strchr(const char* s, char c); char* strchr( char* s, char c); Первая форма функции ведет поиск заданных элементов в массиве константных символов и возвращает константный указатель на первый из обнаруженных символов. Вторая форма функции работает с неконстантным массивом и возвращает неконстантный указатель. Такая перегрузка имен функций предотвращает потенциальную опасность возврата неконстантного указателя на массив константных значений. Перегрузка имен функций также позволяет использовать одни и те же функции для работы со значениями, отличающимися заданным уровнем точности. Например, функция языка С double sin(double); была перегружена в С++ следующим образом: float sin(float); double sin(double); и long double sin(long double); И наконец, все компоненты, унаследованные из библиотеки С, за исключением макросов, были добавлены в пространство имен std. (Макросы языка С по-прежнему доступны, но поскольку они не подчиняются правилам видимости, их нельзя назначить пространству имен.) Мы разберем подробнее тему пространства имен std в главе 2. Какова разница между стандартной библиотекой С++ и стандартной библиотекой шаблоновСтандартную библиотеку шаблонов еще называют библиотекой STL (Standard Template Library). Под этим термином понимают набор интерфейсов и компонентов, разработанных Александром Степановым (Alexander Stepanov) и другими сотрудниками AT&T Bell Laboratories и Hewlett-Packard Research Laboratories. Степанов поставил перед собой цель создать стандартный набор компонентов многоразового использования, максимально реализовав все возможности родового программирования. На сегодняшний день библиотека STL включает в себя библиотеки контейнеров, итераторов, алгоритмов и некоторые части библиотеки общего пользования, которые, в свою очередь, являются составными частями стандартной библиотеки С++. Другими словами, стандартная библиотека шаблонов STL является составной частью библиотеки С++, но при этом весьма существенной частью. Большая часть этой книги посвящена изучению использования средств библиотеки STL. Интерфейсом называется любое формальное описание того, каким образом программист или пользователь может получить доступ к средствам и возможностям, предоставляемым функцией, классом, макросом или любым другим программным компонентом. Интерфейс - это не ключевое слово языка, а абстрактная концепция программирования. Интерфейс класса описывает набор открытых (объявленных с ключевым словом public) функций, типов и переменных данного класса. Интерфейс функции описывает типы аргументов и возвратов функции (другими словами, прототип функции). Принципы, положенные в основу библиотеки STL Когда в конце 1993 года комитету по стандартизации языка С++ были предложены основные идеи создания библиотеки STL, они были приняты и поддержаны с большим энтузиазмом. Это был тот редкий случай, когда предлагалось простое и универсальное решение для многих назревших проблем. Ниже перечислены основные принципы, которых придерживались создатели STL.
Если вам уже приходилось слышать много хвалебных высказываний о библиотеке STL и вы не понимали, о чем идет речь, то надеюсь, теперь вы знаете, что у программистов было достаточно поводов для восторга. Это действительно мощное средство программирования, со всеми возможностями которого вы очень скоро познакомитесь. Наш рабочий набор инструментовПо правде говоря, вы можете читать эту книгу, даже не дотрагиваясь до компьютера. Но чтобы процесс обучения был максимально эффективным, желательно, чтобы вы скомпилировали все или хотя бы некоторые примеры, предлагаемые в книге. Еще лучше будет, если вы попробуете поэкспериментировать с кодом и получить свой вариант программы, что закрепит ваши навыки работы со стандартными библиотечными компонентами. Чтобы не вводить код вручную, вы можете выгрузить листинги из этой книги с Web-страницы издательского дома "Вильямс" http://www.williamspublishing.com. Чтобы скомпилировать и запустить примеры программ, вам потребуются интегрированная среда разработки IDE (Integrated Development Environment) или любой текстовый редактор, современный компилятор С++ и сама стандартная библиотека. Какой компилятор вам подойдетВ основу данной книги положены стандарты языка С++, принятые ISO в июле 1998 года. Теоретически любой отвечающий стандартам компилятор должен работать с предлагаемыми кодами одинаково хорошо. Проблема состоит в том, как определить компилятор, отвечающий стандартам, положенным в основу этой книги. Вполне возможно, что ваш компилятор может не содержать некоторые средства современной стандартной библиотеки С++, если он был выпущен раньше. Некоторые непрофессиональные версии компиляторов в принципе не могут использовать все средства профессиональной стандартной библиотеки. Вам не следует использовать компиляторы, в основу которых положены стандарты, датируемые до декабря 1996 года. Но даже те компиляторы, которые были выпущены между декабрем 1996 года и июлем 1998 года, могут оказаться ограниченными в использовании средств современной стандартной библиотеки С++. Примеры, приведенные в этой книге, протестированы на компиляторах Microsoft Visual C++ 6.0 в среде Windows и GNU egcs 1.1.2 в среде UNIX/Linux. Компилятор egcs представляет собой новое поколение компиляторов GNU и в большей степени соответствует новым стандартам ISO, чем предыдущие версии. Вы можете бесплатно загрузить этот компилятор с Web-страницы http://egcs.cygnus.com/. Другой популярный компилятор, который предназначен для работы в среде Microsoft Windows, - C++ Builder 4.0 компании Borland. (Его следует отличать от устаревшей версии компилятора Borland C++ 4.0, который поддерживает лишь ограниченные возможности современной стандартной библиотеки С++.) Недавно были опубликованы обзоры, свидетельствующие о том, что компиляторы компании KAI и производные компилятора Edison Group в полной мере реализуют возможности стандартной библиотеки. Эти компиляторы хорошо работают с UNIX и со многими другими операционными системами. Поскольку одной из чрезвычайно популярных операционных систем для разработки программного обеспечения является Solaris компании Sun, следует упомянуть о SunPro 5.0 - еще одном компиляторе, который можно использовать со стандартной библиотекой С++. Ранняя версия SunPro 4.2 лишь частично реализует возможности современной стандартной библиотеки. Особенности компиляции Даже используя перечисленные выше компиляторы, следует помнить о возможных ошибках, недостатках и некоторой специфичности в работе каждого из них. В том случае, когда особенности работы могут повлиять на процесс компиляции программных кодов, в книге будут даны примечания, которые выглядят следующим образом. Особенности компиляции. Компилятор XYZ не распознает директиву #include. Для преодоления этого недостатка перед компиляцией следует добавить коды всех файлов источников и библиотечных файлов заголовков в один огромный общий файл с кодом программы. В некоторых случаях подобные примечания будут относиться к целому классу компиляторов, например ко всем компиляторам, выпущенным до 1998 г. В других случаях будет указываться компилятор определенного изготовителя или версия компилятора. Некоторые примеры из данной книги невозможно скомпилировать на первом попавшемся компиляторе и даже не на всех компиляторах, рекомендованных выше. Примите к сведению примечания об особенностях компиляции, но помните, что, поскольку особенности компиляции не являются основной темой данной книги, многие проблемы, связанные с компиляцией программных кодов, здесь опущены. Внимательно просмотрев все примечания, вам может показаться, будто особое внимание я уделил компилятору компании Microsoft. В действительности это не так. Просто при создании примеров для этой книги я использовал компилятор Microsoft, поэтому в примечаниях сравнивал с ним работу других компиляторов. Мой же выбор компилятора компании Microsoft основывался на том факте, что, нравится это кому-нибудь или нет, именно он сейчас наиболее популярный (или наиболее продаваемый) в мире. Где можно достать стандартную библиотекуМногие компиляторы, перечисленные выше, содержат встроенную стандартную библиотеку. Особенности компиляции. Версия стандартной библиотеки, встроенная в компилятор Microsoft Visual C++ 6.0 и его ранние версии, содержит ряд известных ошибок, допущенных изготовителями. По крайней мере одна из этих ошибок может быть причиной, по которой некоторые из приведенных примеров невозможно скомпилировать. Компания Dinkumware, Ltd, которая разрабатывала стандартную библиотеку для этого компилятора, занималась поиском и устранением ошибок в программном коде. Полный список обнаруженных ошибок представлен на Web-странице http://www.dinkumware.com/vc_fixes.html, на которой вы можете также приобрести обновленную версию библиотеки. Некоторые устаревшие версии компиляторов (например, SunPro 4.2) содержат средства управления потоками, не относящиеся к библиотеке STL или стандартному классу строк. Вы можете обновить ваш компилятор, приобретая соответствующие библиотечные блоки из коммерческих или бесплатных источников (некоторые из них перечислены ниже). Страница стандартной библиотеки шаблонов STL Проект STLport разрабатывался с целью бесплатного предоставления средств библиотеки STL и стандартного класса строк для добавления в библиотеки различных компиляторов. STLport встроен также в коммерческую версию библиотеки SGI. Если у вас возникли проблемы с компиляцией, то, вероятно, это первый источник, к которому вам следует обратиться для обновления своей стандартной библиотеки. На данной Web-странице вы также найдете ссылки на другие тематически связанные с ней страницы. ObjectSpace, Inc. Компания ObjectSpace реализует некоторые библиотеки классов для С++ и Java. Многие из библиотек классов C++ содержат встроенные компактные версии STL и библиотеки строк (Standards<Toolkit>). Раньше библиотеки ObjectSpace можно было загружать бесплатно, но сейчас все они реализуются по коммерческим ценам. Rogue Wave, Inc. Подобно ObjectSpace, компания Rogue Wave реализует библиотеки классов для С++, включая стандартную библиотеку. Следует обратить внимание, что многие продукты компании Rogue Wave основываются не на стандартной библиотеке, а на библиотеке Tools.h++ - ее собственной разработке. Эта библиотека представляет собой набор классов оболочек (wrapper), модифицирующих интерфейсы классов STL в стиле ранних компиляторов. Стандартная библиотека компании Rogue Wave совместима с большинством современных компиляторов С+ +. Оболочками (wrapper) называются классы или функции, которые изменяют интерфейсы других классов или функций, не привнося новых возможностей. |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
В избранное | ||