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

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


using namespace std;

class bothWhiteSpaces { private:

const locales loc; Локальный контекст public: /* Конструктор

* - сохранение обьекта локального контекста */

bothWhiteSpaces (const locale 1) : loc(l) { )

/* Функция проверяет, являются ли оба символа пропусками */

bool OperatorO (char elemi, char elem2) {

return isspace(eleml.loc) && 1sspace(elem2.loc);

int mainO {

string contents;

He игнорировать начальные пропуски cin.unsetf (ios::skipws);

Чтение всех символов со сжатием пропусков unique copy(istream iterator<char>(cin). Начало источника istream iterator<char>(). Конец источника

back inserter(contents). Приемник

bothWhiteSpaces(cin.getloc())): Критерий удаления

Обработка содержимого

- в данном случае - зались в стандартный вывод cout contents;

Алгоритм unique copy() (см. с. 377) читает все символы из входного потока данных cin и вставляет их в строку contents. Объект функции bothWhiteSpaces проверяет, являются ли два последовательных символа пропусками. Для этого он инициализируется локальным контекстом cin и вызывает функцию isspace(), которая проверяет, относится ли символ к категории пропусков (функция lsspace() рассматривается на с. 689). Алгоритм unique copy() использует критерий bothWhiteSpaces для удаления смежных пропусков. Похожий пример приведен при описании алгоритма unique copy() на с. 377.

Интернационализация

Как упоминалось во вводном описании строковых классов (см. с. 462). шаблон строкового класса basic string<> параметризуется по типу символов, трактовкам типа символов и модели памяти. Тип string представляет собой специализиро-



ванную версию шаблона для символов типа char, а тип wstring предназначен для символов типа wchar t.

Трактовки типа символов представляют собой информацию о том, как следует постзшать в зависимости от представления тина символов. Необходимость в дополнительном классе объясняется тем, что интерфейс встроенных типов (таких, как char и wchar t) изменять нельзя, но один символьный тип может трактоваться по-разному. Дополнительная информация о классах трактовок приводится на с. 659.

В следующем фрагменте определяется специальный класс трактовок для строк, благодаря которому операции со строками выполняются без учета регистра символов;

string/icstring.hpp #ifndef ICSTRING HPP #def1ne ICSTRING HPP

#1nclude <string> #include <iostreani> #include <cctype>

/* Замена функций стандартного класса char traits<char>

* для того, чтобы операции со строками

* выполнялись без учета регистра символов */

struct 1gnorecase tra1ts public std: :char traits<char> { Проверка равенства cl и c2 static bool eq(const char& cl. const char& c2) { return std;;toupper(cl)==std:;toupper(c2);

Проверка условия cl меньше c2 static bool lt(const char& cl. const char& c2) { return std::toupper(cl)<std::toupper(c2):

Сравнение до n символов si и s2 static int compare(const char* si. const char* s2. std::si2e t n) { for (std::size t i=0; i<n: ++i) ( if (!eq(sl[i].s2[i])) {

return lt(sl[il.s2[il)?-l:l;

return 0;

Поиск cbs

static const char* find(const char* s. std::si2e t n.

const char& c) { for (std;;size t i=0: i<n; ++i) ( if (eq(s[i].c)) { return &(s[i]):



return 0:

Определение специального типа для таких строк

typedef std::basic string<char.ignorecase tra1ts> icstring;

/* Определение оператора вывода.

* так как тип трактовок отличен от типа,

* заданного для std:iostream */

inli пе

std;;ostream& operator (std::ostream& strm. const icstr1ng& s) {

Простое преобразование Icstring в обычную строку return strm std;:string(s.data().s.length());

#end1f ICSTRING HPP

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

В следующей программе показано, как использовать специализированный вид строк:

string/icstringl.cpp #include icstring.hpp

int mainO {

using std::COut; using std;;endl:

icstring slChallo ); icstring s2( otto ): icstring s3( hALLo ):

cout std::boolalpha:

cout si == s2 : (sl==s2) endl: cout si == s3 ; (sl==s3) endl;

icstring;:size type 1dx = sl.find( All ); if (idx != icstring;:npos) {

cout index of \ A11\ in \ si \ : idx endl:



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

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