Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Регулярное выражение можно считать самостоятельной "программой" на простом языке программирования. Этот язык не интерпретируется компилятором С++, и "компилируется" только во время выполнения, когда объект класса regex
инициализируется или присваивается. Как и в любой написанной программе, в регулярных выражениях вполне возможны ошибки.
Важно понимать, что правильность синтаксиса регулярного выражения проверяется во время выполнения.
Если допустить ошибку в записи регулярного выражения, то передача исключения (см. раздел 5.6) типа regex_error
произойдет только во время выполнения . Подобно всем стандартным типам исключений, у исключения regex_error
есть функция what()
, описывающая произошедшую ошибку (см. раздел 5.6.2). У исключения regex_error
есть также функция-член code()
, возвращающая числовой код (зависящий от реализации), соответствующий типу произошедшей ошибки. Стандартные сообщения об ошибках, которые могут быть переданы библиотекой RE, приведены в табл. 17.7.
Таблица 17.7. Причины ошибок в регулярном выражении
Определены в типах regex и regex_constants::syntax_option_type |
|
---|---|
error_collate |
Недопустимый запрос объединения элементов |
error_ctype |
Недопустимый класс символов |
error_escape |
Недопустимый управляющий или замыкающий символ |
error_backref |
Недопустимая обратная ссылка |
error_brack |
Несоответствие квадратных скобок ( [ или ] ) |
error_paren |
Несоответствие круглых скобок ( ( или ) ) |
error_brace |
Несоответствие фигурных скобок ( { или } ) |
error_badbrace |
Недопустимый диапазон в фигурных скобках ( {} ) |
error_range |
Недопустимый диапазон символов (например, [z-a] ) |
error_space |
Недостаточно памяти для выполнения этого регулярного выражения |
error_badrepeat |
Повторяющийся символ ( *? , + или { ) не предваряется допустимым регулярным выражением |
error_complexity |
Затребованное соответствие слишком сложно |
error_stack |
Недостаточно памяти для вычисления соответствия |
Например, в схеме вполне можно пропустить по неосторожности скобку:
try {
// ошибка: пропущена закрывающая скобка после alnum; конструктор
// передаст исключение
regex r("[[:alnum:]+\\.(cpp|схх|cc)$", regex::icase);
} catch (regex_error e)
{ cout << e.what() << "\ncode: " << e.code() << endl; }
При запуске на системе авторов эта программа выводит следующее:
regex_error(error_brack):
The expression contained mismatched [ and ].
code: 4
Компилятор определяет функцию-член code()
для возвращения позиции ошибок, перечисленных в табл. 17.7, счет которых, как обычно, начинается с нуля.
Как уже упоминалось, представляющая регулярное выражение "программа" компилируется во время выполнения, а не во время компиляции. Компиляция регулярного выражения может быть на удивление медленной операцией, особенно если используется расширенная грамматика регулярного выражения или выражение слишком сложно. В результате создание объекта класса regex
и присвоение нового регулярного выражения уже существующему объекту класса regex
может занять много времени. Для минимизации этих дополнительных затрат не создавайте больше объектов класса regex
, чем необходимо. В частности, если регулярное выражение используются в цикле, его следует создать вне цикла, избежав перекомпиляции при каждой итерации.
Поиск возможен в любой из исходных последовательностей нескольких типов. Входные данные могут быть обычными символами типа char
или wchar_t
, и эти символы могут храниться в библиотечной строке или в массиве символов (или в его версии для wchar_t
, или wstring
). Библиотека RE определяет отдельные типы, соответствующие этим разным типам исходных последовательностей.
Предположим, например, что класс regex
содержит регулярное выражение типа char
. Для типа wchar_t
библиотека определяет также класс wregex
, поддерживающий все операции класса regex
. Единственное различие в том, что инициализаторы класса wregex
должны использовать тип wchar_t
вместо типа char
.
Типы соответствий и итераторов (они рассматриваться в следующих разделах) более специфичны. Они отличаются не только типом символов, но и тем, является ли последовательность библиотечным типом или массивом: класс smatch
представляет исходные последовательности типа string
; класс cmatch
— символьные массивы; wsmatch
— строки Unicode ( wstring
); wcmatch
— массивы символов wchar_t
.
Таблица 17.8. Библиотечные классы регулярных выражений
Тип исходной последовательности | Используемый класс регулярного выражения |
---|---|
string |
regex , smatch , ssub_match и sregex_iterator |
const char* |
regex , cmatch , csub_match и cregex_iterator |
wstring |
wregex , wsmatch , wssub_match и wsregex_iterator |
const wchar_t* |
wregex , wcmatch , wcsub_match и wcregex_iterator |
Важный момент: используемый тип библиотеки RE должен соответствовать типу исходной последовательности. Соответствие классов видам исходных последовательностей приведено в табл. 17.8. Например:
regex r("[[:alnum:]]+\\.(cpp|схх|cc)$", regex::icase);
smatch results; // будет соответствовать последовательности типа
// string, но не char*
if (regex_search("myfile.cc", results, r)) // ошибка: ввод char*
cout << results.str() << endl;
Компилятор С++ отклонит этот код, поскольку тип аргумента и тип исходной последовательности не совпадают. Если необходимо искать в символьном массиве, то следует использовать объект класса cmatch
:
cmatch results; // будет соответствовать последовательности символьного
// массива
if (regex_search("myfile.cc", results, r))
cout << results.str() << endl; // вывод текущего соответствия
Обычно программы используют исходные последовательности типа string
и соответствующие ему версии компонентов библиотеки RE.
Упражнение 17.14. Напишите несколько регулярных выражений, предназначенных для создания различных ошибок. Запустите программу и посмотрите, какие сообщения выводит ваш компилятор для каждой ошибки.
Читать дальшеИнтервал:
Закладка: