|
Программирование >> Включение нужных заголовков
Совет 50. Помните о web-сайтах, посвященных STL Интернет богат информацией об STL. Если ввести в любой поисковой системе запрос STL , вы ползп1ите сотни ссылок, часть из которых даже будет содержать полезную информацию. Впрочем, большинство программистов STL в поисках не нуждается и хорошо знает следующие сайты: сайт SGI STL, http: www.sgi.com/tech/stl; сайт STLport, http: stlport.org; сайт Boost, http: www.boost.org. Ниже я постараюсь объяснить, почему эти сайты заслуживают вашего внимания. Сайт SGI STL Web-сайт SGI STL не случайно находится в начале списка. На нем имеется подробная документация по всем компонентам STL. Многие программисты рассматривают его как основной источник электронной документации независимо от используемой платформы STL. Документацию собрал Мэтт Остерн (Matt Austern), который позднее дополнил ее и представил в книге Generic Programming and the STL [4]. Материал не сводится к простому описанию компонентов STL. Например, описание потоковой безопасности контейнеров STL (см. совет 12) основано на материалах сайта SGI STL. На сайте SGI программисту предлагается свободно распространяемая реализация STL. Она была адаптирована лишь для ограниченного круга компиляторов, но поставка STL легла в основу распространенной поставки STLport, описанной ниже. Более того, в реализацию STL от SGI входят некоторые нестандартные компоненты, делающие программирование в STL не только более мощным и гибким, но и более интересным. Некоторые из них стоит выделить. Хэшированные ассоциативные контейнеры hashset, hashjnul t1 set, hashjnap и hash muUiinap. За дополнительной информацией об этих контейнерах обращайтесь к совету 25. Односвязный список si i St. Контейнер si i st реализован наиболее стандартным образом, а итераторы указывают на те узлы списка, на которые они и должны указывать. К сожалению, этот факт оборачивается дополнительными затратами при реализации функций i nsert и erase, поскольку обе функции должны модифицировать указатель на следующий узел списка в узле, предшествующем тому, на который указывает итератор. В двусвязном списке (например, в стандартном контейнере 1 ist) это не вызывает проблем, но в односвязном списке возврат к предыдущему узлу является операцией с линейной сложностью. В контейнере si ist из реализации SGI функции insert и erase выполняются с линейной сложностью вместо постоянной, что является существенным недостатком. В реализации SGI эта проблема решается при помощи нестандартных (но зато работающих с постоянной сложностью) функций insert after и erase after. В сопроводительной документации говорится: ...Если окажется, что функции insert after и erase after плохо подходят для ваших целей, и вам часто приходится вызывать функции insert и erase в середине списка, вероятно, вместо si i st лучше воспользоваться контейнером 1 ist . В реализацию Dinkumware также входит односвязный список si i st, но в нем используется другая архитектура итераторов, сохраняющая постоянную сложность при вызовах insert и erase. За дополнительной информацией о Dimkumware обращайтесь к приложению Б. Контейнер горе, аналог string для очень больших строк. В документации SGI контейнер горе описывается так: Контейнер горе представляет собой масштабированную разновидность stri ng: он предназначен для эффективного выполнения операций со строками в целом. Затраты времени на такие операции, как присваивание, конкатенация и выделение подстроки, практически не зависят от длины строки. В отличие от строк С, контейнер горе обеспечивает разумное представление для очень длинных строк (например, содержимого буфера текстового редактора или сообщений электронной почты) . Во внутреннем представлении контейнер горе реализуется в виде дерева подстрок с подсчетом ссылок, при этом каждая строка хранится в виде массива char. Одна из интересных особенностей интерфейса горе заключается в том, что функции begin и end всегда возвращают тип const iterator. Это сделано для предотвращения операций, изменяющих отдельные символы. Такие операции обходятся слишком дорого. Контейнер горе оптимизирован для операций с текстом в целом или большими фрагментами (присваивание, конкатенация и вьщеление подстроки); операции с отдельными символами выполняются неэффективно. Различные нестандартные объекты функций и адаптеры. Некоторые классы функторов из исходной реализации HP STL не вошли в Стандарт С++. Опытным мастерам старой школы больше всего не хватает функторов selectlst и select2nd, чрезвычайно удобных при работе с контейнерами тар и multimap. Функтор selectlst возвращает первый компонент объекта pair, а функтор select2nd возвращает второй компонент объекта pair. Пример использования этих нестандартных шаблонов классов функторов: map<int.string> m; Вывод всех ключей тар в cout transform(m.begin(),m.end(). ostreamjterator<int>(cout. \п ), sel ectlst<niap<i nt, stri ng>:: val ue type>()): Создать вектор и скопировать в него все ассоциированные значения из тар vector<string> v: transform(m.begin().m.end().back inserter(v). select2nd<niap<int,string>:: value type>()); Как видите, функторы selectlst и select2nd упрощают использование алгоритмов в ситуациях, где обычно приходится писать собственные циклы (см. совет 43). С другой стороны, вследствие нестандартности функторов вас могут обвинить в написании непереносимого и вдобавок плохо сопровождаемого кода (см. совет 47). Настоящих фанатов STL это нисколько не волнует. Они считают, что отсутствие selectlst и select2nd в Стандарте само по себе является вопиющей несправедливостью. К числу нестандартных объектов функций, входящих в реализацию STL, также принадлежат объекты identity, projectlst, project2nd, composel и compose2. Информацию о них можно найти на сайте, хотя пример использования compose2 приводился на с. 172 настоящей книги. Надеюсь, я убедил вас в том, что посещение web-сайта SGI принесет несомненную пользу. Реализация библиотеки от SGI выходит за рамки STL. Первоначально ставилась цель разработки полной реализации стандартной библиотеки C-I-+ за исключением компонентов, унаследованных из С (предполагается, что у вас в распоряжении уже имеется стандартная библиотека С). По этой причине с сайта SGI также стоит получить реализацию библиотеки потоков ввода-вывода С++. Как следует ожидать, эта реализация хорошо интегрируется с реализацией STL от SGI, но при этом по быстродействию она превосходит многие аналогичные реализации, поставляемые с компиляторами С++. Сайт STLport Главная отличительная особенность STLport заключается в том, что эта модифицированная версия реализации STL от SGI (включая потоки ввода-вывода и т. д.) была перенесена более чем на 20 компиляторов. STLport, как и библиотека SGL распространяется бесплатно. Если ваш код должен работать сразу на нескольких платформах, вы избавите себя от множества хлопот, если возьмете за основу унифицированную реализацию STLport и будете использовать ее со всеми компиляторами. Большинство изменений кода SGI в реализации STLport связано с улучшением переносимости, однако STLport является единственной известной мне реализацией, в которой предусмотрен отладочный режим для диагностики случаев неправильного использования STL - компилируемых, но приводящих к непредсказуемым последствиям во время работы программы. Например, в совете 30 распространенная ошибка записи за концом контейнера поясняется следующим примером: int transnragrifydnt х): Функция вычисляет некое новое значение по переданному параметру х vector<int> values: Заполнение вектора values данными vector<int> results: transformCvalues.beginO. Попытка записи за концом results! values.endO, results.end. transmogrify): Этот фрагмент компилируется, но во время выполнения работает непредсказуемо. Если вам повезет, проблемы возникнут при вызове transform, и отладка будет относительно элементарной. Гораздо хуже, если вызов transform испортит данные где-то в другом месте адресного пространства, но это обнаружится лишь позднее. В этом случае определение причины порчи данных становится задачей - как бы выразиться? - весьма нетривиальной.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |