Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 71
Текст из файла (страница 71)
(То есть ищет последнее совпадение со строкой, содержащейся в объекте объект строка.) Если искомая строка найдена, функция гцп11() возвращает индекс вызывающей строки, соответствующий найденному совпадению. Если искомая строка не найдена, функция гГ)про возвращает значение пров. Для сравнения целых строковых объектов удобнее всего пользоваться описанными ранее перегруженными операторами отношения. Тем не менее, если вы захотите сравнить части строк, вам понадобится функция-член сот- рпгеО.
Ниже представлен прототип этой функции: 1пг сопрвхе(вз.хе Суре начало, ел.хе Суре число, сопМ агг1пп Ооаеекх скроив) сопв11 Здесь с вызывающей строкой сравниваются число символов объекта объект строка, начиная с индекса начало. Если вызывающая строка меньше, чем обвехт строка, функция согпрпгеО возвращает отрицательное значение. Если вызывающая строка больше, чем объект строка, функция еотрагеО возвращает положительное значение. Если вызывающая строка равна объекту обвект строка, возвращаемое значение функции со)прпгеО равно нулю. Хотя объекты типа в1г)пп сами по себе очень удобны, иногда у вас все же будет возникать необходимость в версии строки в виде массива символов, оканчивающихся нулем.
Например, объект типа вгг)пи можно использовать для образования имени файла. Однако при открытии файла вам придется задавать указатель на стандартную, оканчивающуюся нулем строку. Для решения проблемы в классе в1ппп имеется функция-член с в1гО, прототип которой показан ниже: сонат сЬаг вс вСх() сопит; Функция возвращает указатель на оканчивающуюся нулем версию строки, содержащуюся в вызывающем объекте типа в1ппп. Оканчивающаяся нулем строка не должна меняться. Кроме этого, если над объектом типа я1г)пп выполнялись какие-либо другие операции, правильность выполнения функции с з1г() не гарантируется. Поскольку класс Мппд является контейнером, в нем поддерживаются функции Ьерп() и епйО, возвращающие соответственно итератор начала и конца строки. Также поддерживается функция в(леО, возвращающая текущее число символов строки. 468 Самоучитель С++ 1.
Хотя мы уже привыкли к традиционным строкам в стиле С, в С++ класс а4ппя делает обработку строк существенно проще. Например, при работе с объектами типа а4ппя для присваивания строк можно использовать оператор —, для конкатенации строк — оператор +, а для сравнения строк — различные операторы сравнения. В следуюшей программе показаны эти операции. // Короткий пример использования строкового класса ()тпс1нс)е <1озггеага> гт)пс)пс)е <зсгьпд> из|па пагпеярасе зМт )и( гааап () ясгтпд зег1("Представление строк" ); ясгтпс зсг2("Вторая строка" )," ясгтпсу зсгЗ~ присваивание строк ьггз = ягг1; сонг « я~г1 « "1п" « яогЗ << "~п"; конкатенация двух строк яГгЗ = яГт1 + зсг2ф сонг « ясгЗ « "~п"; сравнение строк 1Г(яггз > ягг1) сонг « иЗГГЗ > ЗГГ1~ПЯ~ 1Г(ЗГГЗ ==- ЗГГ1+ЗСГ2) СОНГ « ЯЗГГЗ вЂ” З"Г1+ЗГГ2~П"р строковому объекту можно присвоить обычную строку ясг1 = "это обычная строкаЫ") соус « ягг1; создание строкового объекта с помощью другого строкового объекта ясгтвс згг4(згг1); сонг « згг4> ввод строки соня « Введите строку: сзп >> зге4; сонг « зсг4; гесвгп Ор После выполнения программы на экране появится следуюшее: Представление строк Представление строк Глава )4.
Библиотека стендертнык «аабланав Представление строкВторея строка яггЗ > век1 явгЗ ==- ясг1+я "2 Это обьиная строка Это ооынная строка Введите строку: Привет Привет Как видите, с объектами типа яраг«вя можно обращаться так же, как и со встроенными типами данных С++. Это, фактически, и есть главное достоинство строкового класса. Отметьте простоту манипулирования со строками: для конкатенации строк используется обычный оператор +, а для их сравнения — обычный оператор >. Чтобы выполнить те же операции для оканчивающихся нулем строк в стиле С, вам пришлось бы вызывать функции Иге««$0 и я1гсп«р(), что, согласитесь, гораздо менее удобно. Поскольку объекты типа Фг«вИ можно совершенно свободно указывать в выражениях вместе с оканчивающимися нулем строками в стиле С, то никаких неприятностей от их использования в ваших программах быть не может, а выгоды, наоборот, — очевидны.
Имеется еще одна деталь, на которую следует обратить внимание в предыдущей программе: размеры строк не задаются. Объекты типа я«г«вя автоматически настраиваются на хранение строк требуемой длины. Таким образом, когда вы выполняете присваивание или конкатенацию строк, размер целевой строки автоматически вырастает ровно настолько, насколько это нужно для размещения новой строки. Этот динамический аспект использования объектов типа я(гя«й следует всегда принимать во внимание при выборе варианта представления строк в ваших программах. (Как уже отмечалось, стандартные оканчивающиеся нулем строки являются возможным источником нарушения границ массивов).
2. В следующей программе демонстрируются функции «мегино, егмеО и гер«асе(). использование функиий гпяегс О, егаяе () и гер1асе () () 1пс1иде <1ояктеат> $1пс1и<«е <яШпд> нягпд пагпеярасе яраг«« 1пв жа1п() якггпц явг1("это проверка"); век1пд яей2 ( "А««ВГДЕЖ соцс « "Исход«ь~е строки:М" сон(. « "яяг1: " « ясг1 « епе)1« сонг « "всг2« " « ясг2 « "1п~п"« /! работа функции фпяеге() сопя « "Вставка строки ясг2 в строку ясг1«Ж' Самоучитель згг1.
1пзегг (4, згг2) з соцс « ясг1 « "зп'зп" з // работа функции егаяе () соцв « "Удаление семи символов из строки Яег1:з,п" ясг1.егазе (4, 7)' соцс « ягг1 « "ЗП ЗП"; работа функции гер1асе () соцс « "замена весь>вз символов из ягг1 символами из зсг2:з,п" ягг1.гер1асе(4, 8, яГг2); сонг « ягг1 « "з,п'зп" з гегцгп О; ПОСЛЕ ВЫПОЛзНЕНЗ(Я ПРОГРаММЫ На ЭКРаНЕ ПОЯВИТСЯ СЛЕДУЮЦЕЕ: Исходные строки: ягг1: это проверка ясг2з ЗзВВГДЕЖ Вставка строки ягг2 в строку ясг1: это ))БВГДЕЖпроверка Удаление сезяз символов из строки зсг1: Это проверка Замена восьми символов из ягг1 символазяз из ясг2 Это АБВГДЕЖ 3. Поскольку класс в4тищ определяет тип данных, появляется возможность создавать контейнеры для хранения объектов типа я1г)пя. Например, ниже представлена усоверцгенствованная версия программы создания ассоциативного списка для хранения слов и антонимов, впервые показанная в примере 3 раздела 14.5.
/* Ассоциативный список слов и антонимов для объектов типа я1г(пя ф/ ()1пс1ц<(е <1озггеазв> ()1пс1нс)е <взар> ((1пс1цс(е <зт Епд> ням.пд пашеярасе зес(; зпс ша1п () ( злар<ягг1пд, ясггпд> ш; зпг з. з пз. 1пзегг (ра1г<ясг1пд, ягг1пд> ("да", "нет"] ); и. 1пзегс (ра1г<згг1пд, ягг1ззд> (" хорошо", "плохо".) ) пз, 1пяегТ (ра1г<яггзпд, згг1пд> ( "влево" ), "вправо"> ) ; вз. 1пзегг (рааг<зггзпд, ягг1пд>("вверх" ), "вниз" )); Глава 14. Библиотека стандартных шаблонов згг(пя з„ соиЕ « "Введите слово: сзп» Б шар<втгхпс, зегЫд>::з.Еега~ог р; р =- т. Езпс((з); т Е (р .= ш.
е~и((11 соцЕ « "Антоним: " « р->весопс(; е1ве соил « "такого слова в ассоциативном списке металл"; гегигп О; С помощью объектов типа агапия сохраните в списке следующие строки: четыре девять два один шесть пять десять восемь Затем отсортируйте список и выведите на экран содержимое отсортирован- НОГО Спиека.
Поскольку класс а1г(пя является контейнером, он может использоваться со стандартными алгоритмами. Создайте программу, в которой пользователь вводит строку. Затем с помощью функции совп10 сосчитайте в строке число символов "е" и выведите это значение на экран.
Модифицируйте решение упражнения 2 таким образом, чтобы подсчитыва- лись только символы в нижнем регистре. (Подсказка: воспользуйтесь функ- цией содв$ ИО.) Класс Ыппц — это конкретизация некоторого класса-шаблона. Какого? Теперь вам необходимо выполнить следующие упражнения и ответить на вопросы. 1'. Каким образом библиотека стандартных шаблонов позволяет упростить процесс создания более надежных программ? 2. Опишите контейнер, итератор и алгоритм в терминах библиотеки стандартных шаблонов.
Самоучитель С" + 472 3. Напишите программу создания 10-элементного вектора, содержашего числа от 1 до 10. Затем из полученного вектора скопируйте в список только четные элементы. 4. В чем преимущество использования данных типа згпп8? В чем их единст- венный недостаток? 5. Что такое предикат? б. Переработайте пример 2 раздела 14.5 так, чтобы в нем использовались объекты типа згг1пц. 7. Начните изучение объектов-функций библиотеки стандартных шаблонов. Для начала познакомьтесь со стандартными классами ыпагу йпс11оп и Ы- пату Йвс6оп, которые помогут вам создавать объекты-функции. 8. Изучите техническую документацию на библиотеку стандартных шаблонов, поставляемую с вашим компилятором.
Там вы обязательно обнаружите массу полезных инструментов и приемов программирования. В этом разделе проверяется, хорошо ли вы усвоили материал этой и предыдущих глав. 1. Начиная с главы 1, вы проделали долгий путь. Потратьте еще немного времени для беглого просмотра книги. После этого подумайте, как можно было бы улучшить примеры (особенно в первых шести главах) с помощью всех известных вам теперь инструментов С++. 2. Программирование легче изучать в процессе работы.
Пишите больше программ на С++. Пытайтесь экспериментировать с теми атрибутами языка, которые уникальны только для него. 3. Продолжайте изучение библиотеки стандартных шаблонов. В будущем большинство задач программирования будет решаться именно с помощью библиотеки стандартных шаблонов, поскольку, как правило, кажущаяся сложность работы с контейнерами может быть значительно снижена, благодаря алгоритмам. 4.