Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Эффективное использование STL. Библиотека программиста - Мейерс С.

Мейерс С. Эффективное использование STL. Библиотека программиста — Спб.: Питер , 2002. — 224 c.
ISBN 5-94723-382-7
Скачать (прямая ссылка): effektivnoeispolzovaniestlbibliote2002.djvu
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 114 >> Следующая

о различиях между равенством и эквивалентностью обращайтесь к совету 19.
Совет 35 141
Одиннадцать алгоритмов требуют передачи сортированных интервалов для
того, чтобы обеспечить повышенную эффективность, невозможную без
соблюдения этого требования. Передавайте им только сортированные
интервалы, помните о соответствии двух функций сравнения (передаваемой
алгоритму и используемой при сортировке) и вы избавитесь от хлопот при
проведении поиска, слияния и операций с множествами, а алгоритмы uni que
и uni que copy будут удалять все дубликаты - чего вы, вероятно, и
добивались.
Совет 35. Реализуйте простые сравнения строк без учета регистра символов
с использованием mismatch или lexicographical_compare
Один из вопросов, часто задаваемых новичками в STL - "Как в STL
сравниваются строки без учета регистра символов?" Простота этого вопроса
обманчива. Сравнения строк без учета регистра символов могут быть очень
простыми или очень сложными в зависимости от того, насколько общим должно
быть ваше решение. Если игнорировать проблемы интернационализации и
ограничиться строками, на которые была рассчитана функция strcmp, задача
проста. Если решение должно работать со строками в языках, не
поддерживаемых strcmp (то есть практически в любом языке, кроме
английского), или программа должна использовать нестандартный локальный
контекст, задача чрезвычайно сложна.
В этом совете рассматривается простой вариант, поскольку он достаточно
наглядно демонстрирует роль STL в решении задачи (более сложный вариант
связан не столько с STL, сколько с проблемами локального контекста,
упоминаемыми в приложении А). Чтобы простая задача стала интереснее, мы
рассмотрим два возможных решения. Программисты, разрабатывающие
интерфейсы сравнения строк без учета регистра, часто определяют два
разных интерфейса: первый по аналогии с strcmp возвращает отрицательное
число, ноль или положительное число, а второй по аналогии с оператором <
возвращает true или fal se. Мы рассмотрим способы реализации обоих
интерфейсов вызова с применением алгоритмов STL.
Но сначала необходимо определить способ сравнения двух символов без учета
регистра. Если принять во внимание аспекты интернационализации, задача не
из простых. Следующая функция сравнения несколько упрощена, но в данном
совете проблемы интернационализации игнорируются, и эта функция вполне
подойдет:
int ciCharCompare(char cl. char c2) // Сравнение символов без учета
{ // регистра. Функция возвращает -1,
// если с1<с2, 0, если с1=с2, и 1,
// если с1>с2.
int lcl = tolower(static_cast<unsigned char>(cl)): // См. далее int 1с2 =
to1ower(static_cast<unsigned char>(c2)):
if (lcl<1c2) return -1; if (lcl>lc2) return 1; return 0:
}
142 Глава 5 • Алгоритмы
Функция ciCharCompare по примеру strcmp возвращает отрицательное число,
ноль или положительное число в зависимости от отношения между cl и с2. В
отличие от strcmp, функция ciCharCompare перед сравнением преобразует оба
параметра к нижнему регистру. Именно так и достигается игнорирование
регистра символов при сравнении.
Параметр и возвращаемое значение функции to! ower, как и у многих функций
<cctype.h>, относятся к типу int, но эти числа (кроме EOF) должны
представляться в виде unsigned char. В С и C++ тип char может быть как
знаковым, так и беззнаковым (в зависимости от реализации). Если тип char
является знаковым, гарантировать его возможное представление в виде
unsigned char можно лишь одним способом: преобразованием типа перед
вызовом to! ower, этим и объясняется присутствие преобразований в
приведенном выше фрагменте (в реализациях с беззнаковым типом char
преобразование игнорируется). Кроме того, это объясняет сохранение
возвращаемого значения to!ower в переменной типа int вместо char.
При наличии chCharCompare первая из двух функций сравнения строк (с
интерфейсом в стиле strcmp) пишется просто. Эта функция, ciStringCompare,
возвращает отрицательное число, ноль или положительное число в
зависимости от отношения между сравниваемыми строками. Функция основана
на алгоритме mi smatch, определяющем первую позицию в двух интервалах, в
которой элементы не совпадают.
Но для вызова mi smatch должны выполняться некоторые условия. В
частности, необходимо проследить за тем, чтобы более короткая строка (в
случае строк разной длины) передавалась в первом интервале. Вся настоящая
работа выполняется функцией ciStringComparelmpl, а функция
ciStringCompare лишь проверяет правильность порядка аргументов и меняет
знак возвращаемого значения, если аргументы пришлось переставлять:
int ciStringComparelmpKconst strings si. // Реализация приведена далее
const strings s2):
int ciStringCompare(const strings si.const strings s2)
{
if (sl.size()<=s2.size() return ciStringComparelmpl(si,s2);
else return -ciStringComparelmpl(s2,si):
}
Внутри ciStringComparelmpl всю тяжелую работу выполняет алгоритм
mismatch. Он возвращает пару итераторов, обозначающих позиции первых
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 114 >> Следующая