Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:
Решение

Используйте один из методов «find» из

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

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

#include <string>

#include <iostream>

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

Имея такое многообразие алгоритмов поиска, у вас должна быть возможность найти то, что вы ищете, а если такой возможности нет, используйте свои собственные алгоритмы. Однако если

basic_string
не предоставляет то, что требуется, то перед написанием своего кода посмотрите на
<algorithm>
. Стандартные алгоритмы работают с последовательностями, используя итераторы и почти также часто — объекты функций. Для удобства и простоты переноса
basic_string
предоставляет итераторы, так что подключение итераторов
string
к стандартным алгоритмам является тривиальным. Скажем, вам требуется найти первое вхождение двух одинаковых символов подряд. Для поиска двух одинаковых расположенных рядом («расположенных рядом» означает, что их позиции отличаются на один шаг итератора, т.е.
*iter == *(iter + 1))
символов в строке используйте шаблон функции
adjacent_find
.

std::string s = "There was a group named Kiss in the 70s";

std::string::iterator p =

 std::adjacent_find(s.begin, s.end);

Результатом будет итератор, указывающий на первый из двух смежных элементов.

Если вам требуется написать собственный алгоритм работы со строками, не используйте

basic_string
так, как это делается со строками в стиле С, используя для доступа к элементам
operator[]
. Используйте существующие методы. Каждая функция поиска принимает параметр
size_type
, указывающий индекс, с которого должен начаться поиск. Последовательно используя функции поиска, можно пройти по всей строке. Рассмотрим пример 4.16, который подсчитывает число уникальных символов в строке.

Пример 4.16. Подсчет уникальных символов

#include <string>

#include <iostream>

template<typename T>

int countUnique(const std::basic_string<T>& s) {

 using std::basic_string;

 basic_string<T> chars;

 for (typename basic_string<T>::const_iterator p = s.begin;

p != s.end; ++p) {

if (chars.find(*p) == basic.string<T>::npos)

chars += *p;

 }

 return(chars.length);

}

int main {

 std: :string s = "Abracadabra'";

 std::cout << countUnique(s) << '\n';

}

Функции поиска очень часто оказываются полезными. Когда требуется найти что- либо в строке типа

string
, они должны быть первым, что следует использовать.

Поделиться:
Популярные книги

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Девочка-лед

Джолос Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка-лед

Сотник

Ланцов Михаил Алексеевич
4. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Сотник

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Скандальный развод, или Хозяйка владений "Драконье сердце"

Милославская Анастасия
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Скандальный развод, или Хозяйка владений Драконье сердце

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф