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

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

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

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

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

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

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

отличающихся символов в интервалах:
int ciStringComparelmpKconst strings si,const strings s2)
{
typedef pair<string::const_iterator, // PSCI = "pair of
string::const_iterator> PSCI; // string::const_iterator"
PSCI p = mismatch( // Использование ptr_fun
sl.beginO.sl.endO, // рассматривается
s2.begin(), // в совете 41
not2(pt r_fun(с i CharCompa re)));
if (p.first==sl.end()) { if (p.second==s2.end()) return 0:
// Если условие истинно, // либо si и s2 равны.
Совет 35 143
else return -1; // либо si короче s2
}
return ciCharCompare(*p.first.*p.second); // Отношение между
строками
} // соответствует отношению
// между отличающимися // символами
Надеюсь, комментарии достаточно четко объясняют происходящее. Зная первую
позицию, в которой строки различаются, можно легко определить, какая из
строк предшествует другой (или же определить, что эти строки равны). В
предикате, переданном mi smatch, может показаться странной лишь
конструкция not2(ptr_ fun(ciCharCompare)). Предикат возвращает true для
совпадающих символов, поскольку алгоритм mi smatch прекращает работу,
когда предикат возвращает fal se. Для этой цели нельзя использовать
ciCharCompare, поскольку возвращается -1, О или 1, причем по аналогии с
strcmp нулевое значение возвращается для совпадающих символов. Если
передать ciCharCompare в качестве предиката для mismatch, С++ преобразует
возвращаемое значение ciCharCompare к типу bool, а в этом типе нулю
соответствует значение false - результат прямо противоположен тому, что
требовалось! Аналогично, когда ciCharCompare возвращает 1 или -1,
результат будет интерпретирован как true, поскольку в языке С все целые
числа, отличные от нуля, считаются истинными логическими величинами.
Чтобы исправить эту семантическую "смену знака", мы ставим not2 и ptr_fun
перед ciCharCompare и добиваемся желаемого результата.
Второй вариант реализации ciStringCompare основан на традиционном
предикате STL; такая функция может использоваться в качестве функции
сравнения в ассоциативных контейнерах. Реализация проста и предельно
наглядна, поскольку достаточно модифицировать ciCharCompare для получения
функции сравнения символов с предикатным интерфейсом, а затем поручить
всю работу по сравнению строк алгоритму 1 exi cographi cal_compare,
занимающему второе место в STL по длине имени:
bool ciCharLess(char cl. char c2) // Вернуть признак того.
{ // предшествует ли cl
// символу с2 без учета
return // регистра. В совете 46
tolwer(static_cast<unsigned char>(cl))< // объясняется, почему
tolower(static_cast<unsigned char>(c2)); // вместо функции может
} // оказаться предпочтительным
// объект функции bool ciStringCompare(const strings si, const strings
s2)
{
return 1exicographical_compare(sl.begin(),sl.end(), // Описание
s2.begin(),s2.end(), // алгоритма ciCharLess); // приведено далее
}
Нет, я не буду долго хранить секрет. Самое длинное имя у алгоритма set_
symmetric_di fference.
Если вы знаете, как работает 1 exi cographi cal compare, приведенный выше
фрагмент понятен без объяснений, а если не знаете - это легко поправимо.
Алгоритм lexicographical_compare является обобщенной версией strcmp.
Функция strcmp работает только с символьными массивами, a lexicographical
compare
144 Глава 5 • Алгоритмы
работает с интервалами значений любого типа. Кроме того, если strcmp
всегда сравнивает два символа и определяет отношение между ними
(равенство, меньше, больше), то 1exicographical_compare может получать
произвольный предикат, который определяет, удовлетворяют ли два значения
пользовательскому критерию.
В предыдущем примере алгоритм 1 exi cographical_compare должен найти
первую позицию, в которой si и s2 различаются по критерию ciCharLess.
Если для символов в этой позиции ciCharLess возвращает true, то же самое
делает и 1 exi cographi cal_ compare: если в первой позиции, где символы
различаются, символ первой строки предшествует соответствующему символу
второй строки, то первая строка предшествует второй. Алгоритм
lexicographicalcompare, как и strcmp, считает два интервала разных
величин равными, поэтому для таких интервалов возвращается значение fal
se: первый интервал не предшествует второму. Кроме того, по аналогии с
strcmp, если первый интервал завершается до обнаружения различия,
1 exi cographi cal_compare возвращает true - префикс предшествует
любому интервалу, в который он входит.
Довольно о mismatch и lexicographical compare. Хотя в этой книге большое
значение уделяется переносимости программ, я просто обязан упомянуть о
том, что функции сравнения строк без учета регистра символов присутствуют
во многих нестандартных расширениях стандартной библиотеки С. Обычно эти
функции называются stricmp или strcmpi и по аналогии с функциями,
приведенными в данном совете, игнорируют проблемы интернационализации.
Если вы готовы частично пожертвовать переносимостью программы, если
строки заведомо не содержат внутренних нуль-символов, а проблемы
Предыдущая << 1 .. 67 68 69 70 71 72 < 73 > 74 75 76 77 78 79 .. 114 >> Следующая