Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4113

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть IV. Стандартная библиотека языка программирования С++ 

426 

В  заголовочном  файле  string  также  определяются  типы 

string

  и 

wstring

,  которые  являются  синонимами  шаблонных  классов 

basic_string<char>

  и 

basic_string<wchar_t>

  соответственно,  т. е. 

синонимами  контейнерных  классов,  элементами  которых  явля-
ются символы типов 

char

 и 

wchar_t

Кроме  того,  в  заголовочном  файле  string  определены  шаблоны 
операторов  сравнения  и  сцепления  строк,  а  также  функции  для 
ввода строк и обмена строк своими значениями. Все эти операто-
ры  и  функции  будут  рассмотрены  в  следующих  разделах  этой 
главы. 

39.1. Характеристики символов 

Характеристики  (traits)  это  множество  классов,  каждый  из  кото-
рых обладает определенными свойствами. Эти свойства задаются 
набором  типов  и  функций,  которые  должны  быть  определены  в 
любом  классе  из  этого  множества.  Характеристики  позволяют 
единообразно  обрабатывать  различные  классы,  которые  облада-
ют  одинаковыми  свойствами.  Характеристики  могут  быть  опре-
делены при помощи шаблона класса. В этом случае каждый шаб-
лонный класс, созданный из этого шаблона, обладает заданными 
свойствами. 
Характеристики  символов  задаются  шаблоном  класса 

char_ 

traits

, который имеет следующий интерфейс: 

template<class E> class char_traits 

public: 
  // ассоциированный тип, определяемый параметром шаблона 
  typedef E char_type; 
  // ассоциированные типы, определяемые реализацией 
  typedef T1 int_type; 
  typedef T2 pos_type; 
  typedef T3 off_type; 
  typedef T4 state_type; 
  // функции присваивания 
  static void assign(char_type& x, const char_type& y); 


background image

Глава 39. Работа со строками в С++ <string> 

427 

  static char_type* assign( 
    char_type *x, size_t n, char_type y); 
  // функции сравнения 
  static bool eq(const char_type& x, const char_type& y); 
  static bool lt(const char_type& x, const char_type& y); 
  static int compare( 
    const char_type *x, const char_type *y, size_t n); 
  static bool eq_int_type( 
    const int_type& ch1, const int_type& ch2); 
  // функция определения длины символа 
  static size_t length(const char_type *x); 
  // функции копирования символов 
  static char_type *copy( 
    char_type *x, const char_type *y, size_t n); 
  static char_type *move( 
    char_type *x, const char_type *y, size_t n); 
  // функция поиска символа 
  static const char_type *find( 
    const char_type *x, size_t n, const char_type& y); 
  // функции преобразования символов 
  static char_type to_char_type(const int_type& ch); 
  static int_type to_int_type(const char_type& c); 
  // функции определения конца файла 
  static int_type eof(); 
  static int_type not_eof(const int_type& ch); 
}; 

Предполагается, что параметр шаблона является типом, для кото-
рого определены конструктор по умолчанию, конструктор копи-
рования  и  оператор  присваивания.  Кроме  того,  побитовое  копи-
рование  объектов  этого  типа  должно  быть  эквивалентно  испол-
нению оператора присваивания. 
Ассоциированные  типы,  определяемые  реализацией,  имеют  сле-
дующее назначение: 

 

int_type

 —  целочисленный  тип,  который  допускает  преобра-

зование  к  типу 

E

  и  наоборот,  а  также  обеспечивает  представ-

ление  любого  символа,  т. е.  объекта  типа 

E

,  без  потери  зна- 

чения; 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

428 

 

pos_type

 — тип для описания индикатора позиции файла; 

 

off_type

 — тип для описания смещения в операциях по изме-

нению значения индикатора позиции файла; 

 

state_type

 — тип для описания состояния разбираемой строки 

длинных (multibyte) символов. 

Прежде  чем  рассматривать  функции-члены  шаблона  класса 

char_traits

,  заметим,  что  все  они  определены  как  статические 

члены класса. Теперь перейдем к описанию этих функций: 

 

assign

 — присваивают символы. Первая функция присваивает 

параметру 

x

  значение  параметра 

y

.  Вторая  функция  присваи-

вает 

n

 элементам массива 

x

 значение параметра 

y

 

eq

 — возвращает значение 

true

, если 

x

 равно 

y

false

 — в ос-

тальных случаях; 

 

lt

 —  возвращает  значение 

true

,  если 

x

  меньше 

y

false

 — 

в остальных случаях; 

 

compare

 —  поэлементно  сравнивает  массивы 

x

  и 

y

  длины 

n

возвращает: 

 

отрицательное число, если для первых не равных элементов 
элемент массива 

x

 меньше элемента массива 

y

 

ноль, если все элементы массивов равны; 

 

положительное число в остальных случаях; 

 

eq_int_type

 —  возвращает  значение 

true

,  если 

ch1

  равно 

ch2

значение 

false

 — в остальных случаях; 

 

length

 —  возвращает  количество  символов  в  последователь-

ности 

x

 до первого символа 

char_type()

 

copy

 — копирует 

n

 символов из массива 

x

 в массив 

y

. Возвра-

щает массив 

x

. Массивы не должны перекрываться; 

 

move

 — копирует 

n

 символов из массива 

x

 в массив 

y

. Возвра-

щает массив 

x

. Массивы могут перекрываться; 

 

find

 — возвращает адрес первого элемента массива 

x

, который 

равен параметру 

y

 

to_char_type

 —  преобразует  значение  параметра 

ch

  к  типу 

char_type


background image

Глава 39. Работа со строками в С++ <string> 

429 

 

to_int_type

 —  преобразует  значение  параметра 

c

  к  типу 

int_type

 

eof

 —  возвращает  значение,  обозначающее  конец  файла.  Это 

значение не должно быть равно ни одному из значений типа 

E

которое обозначает символ; 

 

not_eof

 —  сравнивает  значение  параметра 

ch

  со  значением 

eof()

.  Если  эти  значения  не  равны,  то  функция  возвращает 

значение  параметра 

ch

,  в  противном  случае  она  возвращает 

значение, отличное от значения 

eof()

На практике шаблон класса 

char_traits

 используется редко, т. к. 

в  заголовочном  файле  string  определены  две  явные  специализа-
ции  этого  шаблона  класса,  а  именно 

char_traits<char>

  и 

char_traits<wchar_t>

, которые и используются при работе с сим-

волами типов 

char

 и 

wchar_t

 соответственно. 

В  листинге  39.1  приведен  пример  работы  с  шаблоном  класса 

char_traits

Листинг 39.1. Пример работы с шаблоном класса 

char_traits

 

#include <iostream> 
#include <string.h> 
#include <string> 
using namespace std; 

int main() 

  typedef char_traits<char> traits; 
  char ch; 
  char* s = "Demo string"; 
  char buf[256]; 

  traits::assign(ch, 's'); 
  cout << ch << endl;             // s 

  cout << traits::compare(s, s, ::strlen(s)) << endl;  // 0 

  traits::copy(buf, s, ::strlen(s) + 1); 
  cout << buf << endl;            // Demo string 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

430 

  cout << traits::eof() << endl;  // -1 

  return 0; 

39.2. Строки 

В языке программирования С++ под строкой понимается контей-
нерный  объект  шаблонного  класса,  хранящий  последователь-
ность символов: 

  template<class E, class T = char_traits<E>, 
    class A = allocator<E>> class basic_string; 

При этом тип символов, из которых состоит строка, определяется 
параметром 

E

  шаблона.  Характеристики  символов  задаются  па-

раметром 

T

  шаблона  класса,  а  параметр 

A

  задает  класс,  который 

управляет распределением памяти под символ типа 

E

В  заголовочном  файле  string  также  определяются  типы 

string

  и 

wstring

,  которые  являются  синонимами  шаблонных  классов 

basic_string<char>

  и 

basic_string<wchar_t>

  соответственно.  Эти 

типы  позволяют  работать  со  строками,  элементами  которых  яв-
ляются символы типов 

char

 и 

wchar_t

 соответственно. Как прави-

ло,  этих  типов  хватает  для  обработки  символьной  информации, 
исключая  длинные  (multibyte)  символы  восточных  алфавитов. 
Поэтому непосредственно с шаблоном класса 

basic_string

 рабо-

тают редко. 
Строки  языка  программирования  С++  обладают  следующей  до-
полнительной  функциональностью  по  сравнению  со  строками 
языка программирования С: 

 

автоматическое управление размером строки; 

 

вставка в строку символов и других строк; 

 

удаление из строки символов и подстрок; 

 

замена в строке символов и подстрок. 

В следующих подразделах описаны все открытые (public) типы и 
члены, определенные в шаблоне класса 

basic_string


Смотрите также файлы