Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Упражнение 17.15. Напишите программу, используя схему поиска слов, нарушающих правило " i перед е , кроме как после c ". Организуйте приглашение для ввода пользователем слова и вывод результата его проверки. Проверьте свою программу на примере слов, которые нарушают и не нарушают это правило.
Упражнение 17.16. Что будет при инициализации объекта класса regex
в предыдущей программе значением "[^c]ei"
? Проверьте свою программу, используя эту схему, и убедитесь в правильности своих ожиданий.
17.3.2. Типы итераторов классов соответствия и regex
Программа проверки правила " i перед е , кроме как после с " из раздела 17.3.1 выводила только первое соответствие в исходной последовательности. Используя итератор sregex_iterator
, можно получить все соответствия. Итераторы класса regex
являются адаптерами итератора (см. раздел 9.6), привязанные к исходной последовательности и объекту класса regex
. Как было описано в табл. 17.8, для каждого типа исходной последовательности используется специфический тип итератора. Операции с итераторами описаны в табл. 17.9.
Когда итератор sregex_iterator
связывается со строкой и объектом класса regex
, итератор автоматически позиционируется на первое соответствие в заданной строке. Таким образом, конструктор sregex_iterator()
вызывает функцию regex_search()
для данной строки и объекта класса regex
. При обращении к значению итератора возвращается объект класса smatch
, соответствующий результатам самого последнего поиска. При приращении итератора для поиска следующего соответствия в исходной строке вызывается функция regex_search()
.
Таблица 17.9. Операции с итератором sregex_iterator
Эти операции применимы также к итераторам cregex_iterator , wsregex_iterator и wcregex_iterator |
|
---|---|
sregex_iterator it(b, e, r); |
it — это итератор sregex_iterator , перебирающий строку, обозначенную итераторами b и е . Вызов regex_search(b, е, r) устанавливает итератор it на первое соответствие во вводе |
sregex_iterator end; |
Итератор sregex_iterator , указывающий на позицию после конца |
*it it-> |
Возвращает ссылку на объект класса smatch или указатель на объект класса smatch от самого последнего вызова функции regex_search() |
++it it++ |
Вызывает функцию regex_search() для исходной последовательности, начиная сразу после текущего соответствия. Префиксная версия возвращает ссылку на приращенный итератор, а постфиксная возвращает прежнее значение |
it1 == it2 it1 != it2 |
Два итератора sregex_iterator равны, если оба они итераторы после конца. Два не конечных итератора равны, если они созданы из той же исходной последовательности и объекта класса regex |
sregex_iterator
В качестве примера дополним программу поиска нарушения правила " i перед е , кроме как после с " в текстовом файле. Подразумевается, что file
класса string
содержит все содержимое исходного файла, на котором осуществляется поиск. Новая версия программы будет использовать ту же схему, что и ранее, но для поиска применим итератор sregex_iterator
:
// найти символы ei, следующие за любым символом, кроме с
string pattern("[^с]ei");
// искомая схема должна присутствовать в целом слове
pattern = "[[:alpha:]]*" + pattern + "[[ :alpha:]]*";
regex r(pattern, regex::icase); // игнорируем случай выполнения
// соответствия
// будет последовательно вызывать regex_search() для поиска всех
// соответствий в файле
for (sregex_iterator it(file.begin(), file.end(), r), end_it;
it != end_it; ++it)
cout << it->str() << endl; // соответствующее слово
Цикл for
перебирает все соответствия r
в строке file
. Инициализатор в цикле for
определяет итераторы it
и end_it
. При определении итератора it
конструктор sregex_iterator()
вызывает функцию regex_search()
для позиционирования итератора it
на первое соответствие в строке file
.
Пустой итератор sregex_iterator
, end_it
действует как итератор после конца. Приращение в цикле for
"перемещает" итератор, вызвав функцию regex_search()
. При обращении к значению итератора возвращается объект класса smatch
, представляющий текущее соответствие. Для вывода соответствующего слова вызывается функция-член str()
.
Данный цикл for
как бы перепрыгивает с одного соответствия на другое, как показано на рис. 17.1.

Рис. 17.1. Использование итератора sregex_iterator
Если запустить этот цикл для строки test_str
из первоначальной программы, вывод был бы таким:
freind
theif
Однако вывод только самого слова, соответствующего заданному выражению, не очень полезен. При запуске программы для большой исходной последовательности, например для текста этой главы, имело бы смысл увидеть контекст, в котором встретилось слово. Например:
hey read or write according to the type
>>> being <<<
handled. The input operators ignore whi
Кроме возможности вывода части исходной строки, в которой встретилось соответствие, классы соответствия предоставляют более подробную информацию о соответствии. Возможные операции с этими типами перечислены в табл. 17.10 и 17.11.
Более подробная информация о smatch
и ssub_match
приведена в следующем разделе, а пока достаточно знать, что они предоставляют доступ к контексту соответствия. У типов соответствия есть функции-члены prefix()
и suffix()
, возвращающие объект класса ssub_match
, представляющий часть исходной последовательности перед и после текущего соответствия соответственно. У класса ssub_match
есть функции-члены str()
и length()
, возвращающие соответствующую строку и ее размер соответственно. Используя эти функции, можно переписать цикл программы проверки правописания:
// тот же заголовок цикла for, что и прежде
for (sregex_iterator it(file.begin(), file.end(), r), end_it;
it != end_it; ++it) {
auto pos = it->prefix().length(); // размер префикса
pos = pos > 40 ? pos - 40 : 0; // необходимо до 40 символов
cout << it->prefix().str().substr(pos) // последняя часть префикса
<< "\n\t\t>>> " << it->str() << " <<<\n" // соответствующее
// слово
<< it->suffix().str().substr(0, 40) // первая часть суффикса
<< endl;
}
Таблица 17.10. Операции с типом smatch
Интервал:
Закладка: