Программирование >>  Операторы преобразования типа 

1 ... 152 153 154 [ 155 ] 156 157 158 ... 239


Преобразование всех символов к нижнему регистру transform (s.beginO. s.endO. Источник S.beginO. Приемник

tolower); Операция

cout lowered; s endl;

Преобразование всех символов к верхнему регистру transform (s.beginO, s.endO. Источник S.beginO. Приемник

toupper); Операция

cout uppered: s endl;

Результат вьтолнения программы выглядит так:

original: The zip code of Hondelage in Germany is 38108 lowered: the zip code of hondelage in germany is 38108 uppered: THE ZIP CODE OF HONDELAGE IN GERMANY IS 38108

Обратите внимание на устаревшие функции tolower() и toupper() языка С, использующие универсальный локальный контекст. При работе с другими локальными контекстами следует задействовать новые формы функций tolower() и toupper(). Подробности приводятся на с. 689.

Следующий пример показывает, как при помощи STL задать собственные критерии поиска и сортировки. В этом примере производится поиск и сравнение строк без учета регистра символов.

str1ng/iter2.cpp #include <string> #include <iostream> #include <algorithm> using namespace std:

bool nocase compare (char cl. char c2) {

return toupper(cl) == toupper(c2);

Int main() {

string si( This is a string ): string s2( STRING );

Сравнение строк без учета регистра символов if (si.SizeO = s2.size() && Проверить совпадение размеров

equal (si.beginO.si.endO. Первая строка s2.beginO. Вторая строка

nocase compare)) { Критерий сравнения

cout the strings are equal endl;



else {

cout the strings are not equal endl;

Поиск без учета регистра символов string::1terator pos;

pos = search (si.beginO.si,endO. Строка, в которой ведется поиск s2.beginO .s2.endO. Искомая подстрока nocase conipare); Критерий сравнения

if (pos == sl.endO) {

cout s2 is not a substring of si endl;

else {

cout s2 \ is a substring of \

si \ (at index pos - si.beginO ) endl;

Перед вызовом equal() нужно проследить за тем, чтобы количество элементов во втором интервале было но крайней мере не меньше, чем в первом. Этим объясняется необходимость сравнения размеров; без этой проверки возможны непредсказуемые последствия.

В последней команде вывода индекс символа вычисляется как разность двух итераторов:

pos - si.beginO

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

В приведенном примере определяется вспомогательная функция nocase compareO, сравнивающая строки без учета регистра символов. Вместо нее также можно было бы воспользоваться комбинацией функциональных адаптеров и заменить вызов nocase compare следующим выражением:

compose f gx hy(equal to<int>0.

ptr fun(toupper), ptr fun(toupper))

За дополнительной информацией обращайтесь на с. 310 и 318.

При хранении строк в множествах или отображениях может потребоваться специальный критерий сортировки строк без учета регистра символов. На с. 218 приведен пример определения такого критерия.

В следующей программе приводятся другие примеры строковых операций с применением итераторов;

string/iter3.cpp #include <string> #include <iostream>



#1nclucle <algor1thm> using namespace std:

Int mainO {

Создание константной строки

const string helloCHello. how are you? );

Инициализация строки s всеми символами строки hello string s(hello.begInO.hello.endO);

Перебор всех символов string:;iterator pos;

for (pos = S.beginO; pos И s.endO; ++pos) { cout *pos:

cout endl;

Перестановка символов строки в обратном порядке

reverse (s.beginO. s.endO):

cout reverse: s end1:

Сортировка всех символов строки

sort (S.beginO. s.endO);

cout ordered: s endl;

/* Удаление смежных дубликатов

* - uniqueO изменяет очередность символов и возвращает новый конец

* - eraseO удаляет лишние символы */

S.erase (un1que(s.beginO.

S.endO). S.endO):

cout no duplicates: s endl:

Результат выполнения программы выглядит так: Hello, how are you?

reverse ordered

no duplicates: .?Haehloruwy

?uoy era woh .olleH .?Haeehlloooruwy

В следующем примере содержимое строки читается из стандартного входного потока данных с использованием конечных итераторов вставки:

string/unique.срр #include <iostream> #1nclude <string> #include <algorithm> #1nclude <locale>



1 ... 152 153 154 [ 155 ] 156 157 158 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика