C++. Сборник рецептов - [66]

Шрифт
Интервал

> for (int i = 0; i < n; ++i) {

>  if (arr[i] != NULL)

>   s += arr[i];

>  if (i < n-1) s += c;

> }

>}


>int main() {

> std::wstring ws;

> wchar_t* arr[MAGIC_NUMBER];

> arr[0] = L"you";

> arr[1] = L"ate";

> arr[2] = L"my";

> arr[3] = L"breakfast";

> join(arr, MAGIC_NUMBER, L'/', ws);

>}

4.9. Поиск в строках

Проблема

Требуется выполнить поиск в строке. Это может быть поиск одного символа, другой строки или одного из (или одного не из) неупорядоченного набора символов. И по каким-либо причинам требуется выполнять поиск в определенном порядке, например первое или последнее вхождение или первое или последнее вхождения относительно какого- либо положения в строке.

Решение

Используйте один из методов «find» из >basic_string. Почти все методы поиска начинаются со слова «find», и их имена говорят достаточно о том, что они делают. Пример 4.15 показывает, как работают некоторые из этих методов поиска.

Пример 4.15. Поиск строк

>#include

>#include


>int main() {

> std::string s = "Charles Darwin";

> std::cout << s.find("ar") << '\n'; // Поиск от

>                                    // начала

> std::cout << s.rfind("ar") << "\n"; // Поиск с конца

> std::cout << s.find_first_of("swi") // Найти первое вхождение одного

>  << '\n'; // из этих символов

> std::cout << s.find_first_not_of("Charles") // Найти первое,

>  << '\n';                                   // что не входит в этот

>                                             // набор

> std::cout << s.find_last_of("abg") << '\n'; // Найти первое вхождение любого

>                                             // из этих символов,

>                                             // начиная с конца

> std::cout << s.find_last_not_of("aDinrw") // Найти первое,

>  << '\n';                                 // что не входит в этот

>                                           // набор, начиная с конца

>}

Все эти методы поиска обсуждаются более подробно в разделе «Обсуждение».

Обсуждение

Имеется шесть различных методов для поиска в строках, каждый из которых предоставляет четыре перегруженных варианта. Эти перегрузки позволяют использовать либо параметр >basic_string, либо >charT* (>charT — это символьный тип). Каждый имеет параметр >pos типа >basic_string::size_type, который позволяет указать индекс, с которого следует начать поиск, и есть перегрузка с параметром >n типа >size_type, который позволяет выполнить поиск только n символов из набора.

Запомнить все эти методы довольно сложно, так что в табл. 4.2 дается краткая справка по каждому из них и их параметрам.


Табл. 4.2. Методы для поиска строк

МетодОписание
>size_type find(const basic_string& str, size_type pos = 0) const;Возвращает индекс первого вхождения символа или подстроки начиная с начала или индекса, указанного в параметре >pos.
>size_type find (const charT* s, size_type pos, size_type n) const; size_type find (const charT* s, size_type pos = 0) const; size_type find(charT c, size_type pos = 0) const;Если указан >n, то при поиске используются первые >n символов целевой строки
>size_type rfind(...)Находит первое вхождение символа или подстроки, начиная с конца строки и двигаясь к ее началу. Другими словами делает то же, что и >find, но начинает поиск с конца строки
>size_type find_first_of(...)Находит первое вхождение любого символа из набора, переданного как >basic_string или указатель на символы. Если указан >n, то ищутся только первые >n символов используемого набора
>size_type find_last_of(...)Находит последнее вхождение любого символа из набора, переданного как >basic_string или указатель на символы. Если указан >n, то ищутся только первые >n символов используемого набора
>size_type find_first_not_of(...)Находит первое вхождение любого символа, не входящего в набор, переданный как >basic_string или указатель на символы. Если указан >n, то принимаются во внимание только первые n символов используемого набора
>size_type find_last_not_of(...)Находит последнее вхождение любого символа, не входящего в набор, переданный как >basic_string или указатель на символы. Если указан >n, то принимаются во внимание только первые >n символов используемого набора

Все эти методы возвращают индекс вхождения искомого элемента, который имеет тип >basic_string::size_type. Если поиск заканчивается неудачей, возвращается >basic_string::npos, которое является специальным значением (обычно -1), указывающим, что поиск был неудачен. Даже хотя обычно это значение -1, сравнивать возвращаемое значение следует именно с >npos, что обеспечит переносимость. Также это сделает код более понятным, так как сравнение с >npos является явной проверкой, не содержащей магических чисел.

Имея такое многообразие алгоритмов поиска, у вас должна быть возможность найти то, что вы ищете, а если такой возможности нет, используйте свои собственные алгоритмы. Однако если >basic_string не предоставляет то, что требуется, то перед написанием своего кода посмотрите на >. Стандартные алгоритмы работают с последовательностями, используя итераторы и почти также часто — объекты функций. Для удобства и простоты переноса >basic_string предоставляет итераторы, так что подключение итераторов


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.