Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Эффективное использование STL. Библиотека программиста - Мейерс С.

Мейерс С. Эффективное использование STL. Библиотека программиста — Спб.: Питер , 2002. — 224 c.
ISBN 5-94723-382-7
Скачать (прямая ссылка): effektivnoeispolzovaniestlbibliote2002.djvu
Предыдущая << 1 .. 97 98 99 100 101 102 < 103 > 104 105 106 107 108 109 .. 114 >> Следующая

select2nd<map<int,string>::value_type>());
Как видите, функторы sel ectlst и sel ect2nd упрощают использование
алгоритмов в ситуациях, где обычно приходится писать собственные циклы
(см. совет 43). С другой стороны, вследствие нестандартности функторов
вас могут обвинить в написании непереносимого и вдобавок плохо
сопровождаемого кода (см. совет 47).
200 Глава 7 • Программирование в STL
Настоящих фанатов STL это нисколько не волнует. Они считают, что
отсутствие selectlst и select2nd в Стандарте само по себе является
вопиющей несправедливостью.
К числу нестандартных объектов функций, входящих в реализацию STL, также
принадлежат объекты identity, projectlst, project2nd, composel и
compose2. Информацию о них можно найти на сайте, хотя пример
использования compose2 приводился на с. 172 настоящей книги. Надеюсь, я
убедил вас в том, что посещение web-сайта SGI принесет несомненную
пользу.
Реализация библиотеки от SGI выходит за рамки STL. Первоначально
ставилась цель разработки полной реализации стандартной библиотеки C++ за
исключением компонентов, унаследованных из С (предполагается, что у вас в
распоряжении уже имеется стандартная библиотека С). По этой причине с
сайта SGI также стоит получить реализацию библиотеки потоков ввода-вывода
C++. Как следует ожидать, эта реализация хорошо интегрируется с
реализацией STL от SGI, но при этом по быстродействию она превосходит
многие аналогичные реализации, поставляемые с компиляторами C++.
Сайт STLport
Главная отличительная особенность STLport заключается в том, что эта
модифицированная версия реализации STL от SGI (включая потоки ввода-
вывода и т. д.) была перенесена более чем на 20 компиляторов. STLport,
как и библиотека SGI, распространяется бесплатно. Если ваш код должен
работать сразу на нескольких платформах, вы избавите себя от множества
хлопот, если возьмете за основу унифицированную реализацию STLport и
будете использовать ее со всеми компиляторами.
Большинство изменений кода SGI в реализации STLport связано с улучшением
переносимости, однако STLport является единственной известной мне
реализацией, в которой предусмотрен "отладочный режим" для диагностики
случаев неправильного использования STL - компилируемых, но приводящих к
непредсказуемым последствиям во время работы программы. Например, в
совете 30 распространенная ошибка записи за концом контейнера поясняется
следующим примером:
int transmogrify(int х): // Функция вычисляет некое новое
значение
// по переданному параметру х
vector<int> values:
// Заполнение вектора values данными
vector<int> results:
transform(values.begin(). // Попытка записи за концом results!
values.endO, results.end. transmogrify):
Этот фрагмент компилируется, но во время выполнения работает
непредсказуемо. Если вам повезет, проблемы возникнут при вызове
transform, и отладка будет относительно элементарной. Гораздо хуже, если
вызов transform испортит данные где-то в другом месте адресного
пространства, но это обнаружится лишь позднее. В этом случае определение
причины порчи данных становится задачей - как бы выразиться? - весьма
нетривиальной.
Совет 50 201
Отладочный режим STLport значительно упрощает эту задачу. При выполнении
приведенного выше вызова transform выдается следующее сообщение
(предполагается, что реализация STLport установлена в каталоге
C:\STLport):
C:\STLport\stlport\stl\debug\_iterator.h:265 STL assertion failure:
_Dereferenceable(*thi s)
На этом программа прекращает работу, поскольку в случае ошибки отладочный
режим STLport вызывает abort. Если вы предпочитаете, чтобы вместо этого
инициировалось исключение, STLport можно настроить и на этот режим.
Честно говоря, приведенное сообщение об ошибке менее понятно, чем
хотелось бы, а имя файла и номер строки относятся к внутренней проверке
условия STL, а не к строке с вызовом transform, но это все же значительно
лучше пропущенного вызова transform и последующих попыток разобраться в
причинах разрушения структур данных. В отладочном режиме STLport остается
лишь запустить программу-отлад-чик, вернуться по содержимому стека к
написанному вами коду и определить, что же произошло. Строка, содержащая
ошибку, обычно находится достаточно легко.
Отладочный режим STLport распознает широкий спектр стандартных ошибок, в
том числе передачу алгоритмам недопустимых интервалов, попытки чтения из
пустого контейнера, передачу итератора одного контейнера в качестве
аргумента функции другого контейнера и т. д. Волшебство основано на
взаимном отслеживании итераторов и контейнеров. При наличии двух
итераторов это позволяет проверить, принадлежат ли они одному контейнеру,
а при модификации контейнера - определить, какие итераторы становятся
недействительными.
В отладочном режиме реализация STLport использует специальные реализации
итераторов, поэтому итераторы vector и string являются объектами классов,
а не низкоуровневыми указателями. Таким образом, использование STLport и
Предыдущая << 1 .. 97 98 99 100 101 102 < 103 > 104 105 106 107 108 109 .. 114 >> Следующая