4.14. Выполнение поиска строк без учета регистра
4.14. Выполнение поиска строк без учета регистра
Проблема
Требуется найти в строке подстроку, не учитывая разницу в регистре.
Решение
Используйте стандартные алгоритмы transform и search, определенные в <algorithm>, а также свои собственные функции сравнения символов, аналогичные уже показанным. Пример 4.22 показывает, как это делается.
Пример 4.22. Поиск строк без учета регистра
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cctype>
using namespace std;
inline bool caseInsCharCompSingle(char a. char b) {
return(toupper(a) == b);
}
string::const_iterator caseInsFind(string& s, const string& p) {
string tmp;
transform(p.begin( ), p.end(), // Преобразуем шаблон
back_inserter(tmp), // к верхнему регистру
toupper);
return(search(s.begin(), s.end(), // Возвращаем итератор.
tmp.begin(), tmp.end(), // возвращаемый из
caseInsCharCompSingle)); // search
}
int main() {
string s = "row, row, row, your boat";
string p = "YOUR";
string::const_iterator ir = caseInsFind(s, p);
if (it != s.end()) {
cout << "Нашли! ;
}
}
Возвращая итератор, который указывает на элемент целевой строки, где начинается шаблонная строка, мы обеспечиваем совместимость с другими стандартными алгоритмами, так как большинство из них принимают в качестве аргумента итератор.
Обсуждение
Пример 4.22 демонстрирует обычный ход действий при работе со стандартными алгоритмами. Создайте функцию, которая выполняет работу, а затем подключите ее как объект функции к наиболее подходящему алгоритму. Здесь работу выполняет функция charInsCharCompSingle, но в отличие от примера 4.21 эта функция сравнения символов переводит к верхнему регистру только первый аргумент. Это сделано потому, что немного далее в caseInsFind я перед использованием строки шаблона в поиске преобразую ее к верхнему регистру полностью и тем самым избегаю многократного преобразования символов строки шаблона к верхнему регистру.
После того как функция сравнения будет готова, используйте для поиска стандартные алгоритмы transform и search. transform используется для преобразования к верхнему регистру всего шаблона (но не целевой строки). После этого используйте для поиска места вхождения подстроки search совместно с функцией сравнения.
Помните, что стандартные алгоритмы работают с последовательностями, а не со строками. Это общие алгоритмы, которые в основном (но не только) работают со стандартными контейнерами, но не делают никаких предположений о содержимом этих контейнеров. Все стандартные алгоритмы требуют передачи им функции сравнения (а в случае их отсутствия используют операторы по умолчанию), которые тем или иным способом сравнивают два элемента и возвращают bool, указывающий, дало ли сравнение истину или ложь.
В примере 4.22 есть одна вещь, которая выглядит странно. Вы видите, что caseInsCompare возвращает const_iterator, как в
string::const_iterator caseInsFind(const string& s,
const string& p)
Что, если требуется изменить элемент, на который указывает возвращенный итератор? Тому есть причина. Она состоит в том, что константный итератор используется потому, что строки, которые передаются в caseInsFind, также передаются как const, и, следовательно, невозможно получить не-const итератор на const-строку. Если требуется итератор, который можно использовать для изменения строки, удалите const из параметров и измените объявление функции так, чтобы она возвращала string::iterator.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Назначение имен тегов и атрибутов зависит от регистра
Назначение имен тегов и атрибутов зависит от регистра В документах HTML имена тегов и атрибутов не зависят от регистра символов, так что, например, запись <TABLE>, <TaBle> или <table> означает один и тот же тег таблицы. Однако в XHTML это разные теги. То же самое касается имен
Функции изменения регистра
Функции изменения регистра strtolowerПроизводит преобразование символов строки в нижний регистр.Синтаксис:string strtolower(string str);Преобразует строку в нижний регистр. Возвращает результат перевода.Надо заметить, что при неправильной настройке локали функция будет выдавать, мягко
if - Выполнение или не выполнение предложений в зависимости от условий
if - Выполнение или не выполнение предложений в зависимости от условий ifПозволяет выполнить или не выполняет определенные предложения в зависимости от заданного условияСинтаксис:if (condition) { statements}Аргументы:В целом, предложение if завершается закрывающей фигурной скобкой
15.8. Программы для учета трафика
15.8. Программы для учета трафика Для мониторинга работы SQUID и вообще для учета трафика можно воспользоваться следующими программами:sqmgrlog — http://www.ineparnet.com.br/orso/index.htmlmrtg — http://www.switch.ch/misc/leinen/snmp/perl/iptraf — http://dkws.narod.ru/linux/soft/iptraf-2.4.0.tar.gzbandmin — http://www.bandmin.orgwebalizer (анализ работы
Реализация многоверсионности. Страницы учета транзакций
Реализация многоверсионности. Страницы учета транзакций Каждая транзакция в InterBase имеет свой уникальный идентификатор - transaction ID или TID (фактически это номер транзакции с момента создания базы данных или последнего restore). Каждая транзакция, запускаясь, получает свой
Глава 31 Настройка системы на особенности учета
Глава 31 Настройка системы на особенности учета Перед началом работы необходимо настроить основные параметры программы. Выберите для этого полный интерфейс конфигурации командой Сервис ? Переключение интерфейса ? Полный интерфейс.• Установка рабочей даты• Ввод
Глава 8 Ведение складского учета
Глава 8 Ведение складского учета Складской учет является одним из основных компонентов бухгалтерского учета. Какую бы финансово-хозяйственную деятельность не осуществлял субъект хозяйствования, без складского учета ему не обойтись: ведь даже предприятия, не ведущие
Глава 9 Ведение производственного учета
Глава 9 Ведение производственного учета В программе ”1С:Бухгалтерия 8” реализованы широкие функциональные возможности по ведению производственного учета. В частности вы можете вводить требования-накладные, формировать производственные отчеты, вести учет материалов,
4.13. Выполнение сравнения строк без учета регистра
4.13. Выполнение сравнения строк без учета регистра ПроблемаИмеются две строки и требуется узнать, не равны ли они, не учитывая регистр их символов. Например, «cat» не равно «dog», но «Cat» должна быть равна «cat», «CAT» или «caT».РешениеСравните строки, используя стандартный
Совет 35. Реализуйте простые сравнения строк без учета регистра символов с использованием mismatch или lexicographical_compare
Совет 35. Реализуйте простые сравнения строк без учета регистра символов с использованием mismatch или lexicographical_compare Один из вопросов, часто задаваемых новичками в STL — «Как в STL сравниваются строки без учета регистра символов?» Простота этого вопроса обманчива. Сравнения
Сравнение строк без учета регистра символов
Сравнение строк без учета регистра символов Мэтт ОстернЕсли вам когда-либо доводилось писать программы, в которых используются строки (а кому, спрашивается, не доводилось?), скорее всего, вы встречались с типичной ситуацией — две строки, различающиеся только регистром
8.1.8. Игнорирование регистра символов
8.1.8. Игнорирование регистра символов По умолчанию команда grep чувствительна к изменению регистра символов. Чтобы провести поиск без учета регистра, воспользуйтесь опцией -i. В файле data.f обозначение месяца Sept встречается как в верхнем, так и в нижнем регистре. Поэтому для