Первая попытка

Первая попытка

Существует несколько способов упорядочения слов по алфавиту. Зайдите в книжный магазин и посмотрите, как расставлены книги на полках. Предшествует ли имя

1 См. статью Александреску A. (Andrei Alexandrescu) в майском номере «С++ Report» за 2000 г. [19].

Mary McCarthy имени Bernard Malamud или следует после него? (В действительности это лишь вопрос привычки, я встречал оба варианта.) Впрочем, простейший способ сравнения строк хорошо знаком нам по школе: речь идет о лексикографическом, или «словарном», сравнении, основанном на последовательном сравнений отдельных символов двух строк.

Лексикографический критерий сравнения может оказаться неподходящим для некоторых специфических ситуаций. Более того, единого критерия вообще не существует — например, имена людей и географические названия иногда сортируются по разным критериям. С другой стороны, в большинстве случаев лексикографический критерий подходит, поэтому он был заложен в основу механизма строковых сравнений в С++. Строка представляет собой последовательность символов. Если объекты х и у относятся к типу std:: string, то выражение х<у эквивалентно выражению

std:: lexicographical_compare(x.begin(),x.end(), y.begin(), y.end())

В приведенном выражении алгоритм lexicographical_compare сравнивает отдельные символы оператором <, однако существует другая версия lexicographical_ compare, позволяющая задать пользовательский критерий сравнения символов. Она вызывается с пятью аргументами вместо четырех; в последнем аргументе передается объект функции, двоичный предикат, определяющий, какой из двух символов предшествует другому. Таким образом, для сравнения строк без учета регистра на базе lexicographical_compare достаточно объединить этот алгоритм с объектом функции, игнорирующим различия в регистре символов.

Распространенный принцип сравнения двух символов без учета регистра заключается в том, чтобы преобразовать оба символа к верхнему регистру и срац-нить результаты. Ниже приведена тривиальная формулировка этой идеи в виде объекта функции С++ с использованием хорошо известной функции toupper из стандартной библиотеки С:

struct lt_nocase

:public std::binary_function<char,char,bool>{

bool operator() (char x.char y) const{

return std::toupper(static_cast<unsigned char>(x))<

std::toupper(static_cast<unsigned char>(y));

}

};

«У каждой сложной задачи есть решение простое, элегантное и... неправильное» Авторы книг С++ обожают этот класс за простоту и наглядность. Я тоже неоднократно использовал его в своих книгах. Он почти правилен, и все-таки не совсем, хотя недостаток весьма нетривиален. Следующий пример выявляет этот недостаток:

int main() {

const char* si = "GEW334RZTRAMINER";

const char* s2 = "gew374rztraminer";

printf("sl=%s, s2=%s ",s1,s2);

printf("sl<s2:2s ",

std: lexicographical_compare(s1,s1+14,s2,s2+14,lt_nocase())

?"true":"false"):

}

Попробуйте запустить эту программу в своей системе. На моем компьютере (Silicon Graphics О2 с системой IRIX 6.5) результат выглядел так:

sl=GEWURZTRAMINER,s2=gewQrztraminer

sl<s2:true

Странно... Разве при сравнении без учета регистра «GEWURZTRAMINER» и «gewurztraminer» не должны быть равными? И еще возможен вариант с небольшой модификацией: если перед командой printf вставить строку

setlocale(LC_ALL,"de");

результат неожиданно изменяется:

sl=GEW0RZTRAMINER,s2=gewurztraminer

sl<s2:false

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

23.3. Первая программа на GTK+

Из книги автора

23.3. Первая программа на GTK+ 23.3.1. Виджиты Перед написанием самой простой GTK-программы нужно разобраться с терминологией GTK. Элементы графического интерфейса пользователя — окна, кнопки, поля ввода, переключатели и тому подобное — называются виджитами.Основным элементом


2. Первая нормальная форма (1NF)

Из книги автора

2. Первая нормальная форма (1NF) На ранних стадиях проектирования баз данных и разработки схем их управления использовались простые и однозначные атрибуты как наиболее продуктивные и рациональные единицы кода. Тогда применяли наряду с простыми и составные атрибуты, а


Проблема первая – субъективность

Из книги автора

Проблема первая – субъективность Все шаги графологического анализа субъективны. Во многих, если не во всех, работах усиленно подчеркивается: анализ должен проводить опытный графолог. То, что он заметит в почерке, новичок пропустит. Но даже если по какой-то случайности


Часть Первая

Из книги автора

Часть Первая «Как же это, как же так? Я была одна, А теперь во мне живет ОН или ОНА...» Песня Тересы («Звезда и смерть Хоакина Мурьеты») Вот и случилось… Не было у дядьки печали, так черти накачали! Как и планировал – поселил в своем доме HP iPaq hx4700, но чтобы это сожительство


ОГОРОД КОЗЛОВСКОГО: Попытка навести порядок. В сумасшедшем доме

Из книги автора

ОГОРОД КОЗЛОВСКОГО: Попытка навести порядок. В сумасшедшем доме Автор: Евгений КозловскийКак вы полагаете? Что главное в сумасшедшем доме? По-моему, порядок. Потому что без него там совсем швах.Мысли о сумасшедшем доме возникают у меня всякий раз не столько когда надо


Raskin — попытка реализации масштабирующегося интерфейса Андрей Письменный

Из книги автора

Raskin — попытка реализации масштабирующегося интерфейса Андрей Письменный Опубликовано 12 августа 2010 года Любая приличная картографическая программа позволяет менять масштаб. При минимальном масштабе можно рассмотреть всю карту целиком, если же


Попытка присваивания

Из книги автора

Попытка присваивания Наша следующая техника адресуется к тем областям Объектной страны, в которых из страха тиранического поведения мы не можем позволить править простым правилам типизации, не встречая никакого


"Принц Персии: Пески Времени" — попытка угодить всем Юрий Ильин

Из книги автора

"Принц Персии: Пески Времени" — попытка угодить всем Юрий Ильин Опубликовано 27 мая 2010 года 27 мая в прокат вышел новый фильм студии Disney «Принц Персии: Пески времени». Начать придётся с того, что это фильм, поставленный по мотивам компьютерной игры.


Приложение З Попытка анализа влияния «пиратов» на тиражи книг

Из книги автора

Приложение З Попытка анализа влияния «пиратов» на тиражи книг Какова роль «пиратских библиотек» в рыночной судьбе книги?В общем, спрос бывает опережающий, ответный и отложенный. При опережающем спросе ты с готовым продуктом входишь в зону давних ожиданий. Лучший пример:


Время пошло!.. Попытка оптимистического прогноза: дело для трех поколений

Из книги автора

Время пошло!.. Попытка оптимистического прогноза: дело для трех поколений Автор: Юрий РомановИтак, сто лет. Все случится в 2107 году. Интрига в чём? Успеем или нет? Хватит ли у нас времени и денег[При подсчётах возможных затрат за основу брались суммы военных бюджетов наиболее


Проект Human Brain: попытка смоделировать работу мозга на суперкомпьютере стоимостью в миллиард евро Андрей Васильков

Из книги автора

Проект Human Brain: попытка смоделировать работу мозга на суперкомпьютере стоимостью в миллиард евро Андрей Васильков Опубликовано 11 февраля 2013Европейская комиссия выбрала проект моделирования работы головного мозга человека на суперкомпьютере как один из наиболее


Сотая колонка: попытка перевести дух, осмотреться и понять, что и зачем я делаю Дмитрий Шабанов

Из книги автора

Сотая колонка: попытка перевести дух, осмотреться и понять, что и зачем я делаю Дмитрий Шабанов Опубликовано 15 марта 2013 Я пишу колонки для КомпьютеррыOnline, которая сейчас превратилась снова просто в Компьютерру, вот уже два года без маленького


Глава первая

Из книги автора

Глава первая Быть может, именно мы сможем изменить этот мир, и поменять систему ценностей (с) Изя Питерский (из размышления о несовершенстве человеческой морали и излишнем влиянии денег) Вот, новый поворот… (с) Макаревич Лес. Очень много леса. Сплошное зеленое покрывало